2006-08-07 рдХреЛ рдЯреНрд░рд╛рдЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдорд╛рд░реНрдЯрд┐рди_рд╡реАрдЪрд░реНрдЯ рджреНрд╡рд╛рд░рд╛ _рдСрд░рд┐рдЬрд┐рдирд▓ рдЯрд┐рдХрдЯ http://projects.scipy.org/numpy/ticket/236 , рдЕрдЬреНрдЮрд╛рдд рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ ред_
In [1]:import numpy
In [2]:numpy.version.version
Out[2]:'1.0b1'
In [3]:a = numpy.arange (5)
In [4]:numpy.add.reduceat (a, (1,1))
Out[4]:array([ 1, 10])
_ @ рдЯреЛрд▓рд┐рдкрд┐рдВрде рдиреЗ 2006-08-08_ рдкрд░ рд▓рд┐рдЦрд╛
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╢рд╛рдпрдж, NumPy рдХреА reduceat рд╡рд┐рдзрд┐ рдЗрд╕ рдХреЛрдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП Numeric рдХреА reduceat рдкрджреНрдзрддрд┐ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреА рд╣реИред
рд╕реВрдЪрдХрд╛рдВрдХ-рд╕рдорд╛рдирддрд╛ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдСрдкрд░реЗрд╢рди рдХреЗ "рдкрд╣рдЪрд╛рди" рддрддреНрд╡ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реБрд╡рд┐рдзрд╛ рдирд╣реАрдВ рд╣реИред рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд╣рд▓реЗ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рддрддреНрд╡ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реИ рдпрджрд┐ рд╕реНрд▓рд╛рдЗрд╕ рдПрдХ рдЦрд╛рд▓реА рдЕрдиреБрдХреНрд░рдо рджреЗрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреБрдирд░реНрдирд╡реАрдиреАрдХрд░рдг рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╣реИ
[a [рез], add.reduce ([[рез:])]
рдпрд╣ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рд╣реИред
_trac рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ martin_wiechert рдиреЗ 2006-08-08_ рдХреЛ рд▓рд┐рдЦрд╛
рдЯрд┐рдХрдЯ # 835 рднреА рджреЗрдЦреЗрдВ
2007-05-12 рдХреЛ @alberts рджреНрд╡рд╛рд░рд╛ рдореАрд▓ рдХрд╛ рдкрддреНрдерд░ 1.1
рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛
2009-03-02 рдкрд░ @cournape рджреНрд╡рд╛рд░рд╛ рдореАрд▓ рдХрд╛ рдкрддреНрдерд░ Unscheduled
рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ # 835 рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ: рдпрджрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рд╕реЗ рдПрдХ len(a)
, рддреЛ reduceat
рдЙрд╕ рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рддрддреНрд╡ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрджрд┐ рд╕реВрдЪрдХрд╛рдВрдХ len(a)
рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдЕрдВрдд рдореЗрдВ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреБрдЫ рдЙрдкрд╛рдп:
reduceat
рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХреЛ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ end - start == 0
end - start == 0
where
рдкреИрд░рд╛рдореАрдЯрд░, рдЬреИрд╕реЗ ufunc()
, рдХреМрди рд╕реЗ рдорд╛рд╕реНрдХ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПредрдХреНрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреЛрдИ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? рдореБрдЭреЗ рдкрд╣рдЪрд╛рди рдореВрд▓реНрдп (рдпрджрд┐ рдпрд╣ рдореМрдЬреВрдж рд╣реИ) рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд░рдЦрдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд╣реЛрдЧреА, рдЬрд╣рд╛рдВ рдЕрдВрдд - рдкреНрд░рд╛рд░рдВрдн == 0ред
рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ reduceat
рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВ рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЦреБрд▓реЗ рдореБрджреНрджреЗ рдореЗрдВ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдмрдЧ рдпрд╛ рд╕реНрдкрд╖реНрдЯ рдбрд┐рдЬрд╛рдЗрди рдЧрд▓рддреА рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдорд╣рд╛рди Numpy рдирд┐рд░реНрдорд╛рдг рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдореЗрдВ рдмрд╛рдзрд╛ рдбрд╛рд▓рддрд╛ рд╣реИред
reduceat
рд╕рднреА рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдЧрд╛рддрд╛рд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрд░реНрдерд╛рддреН, рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪрдХрд╛рдВрдХ i рдХреЗ рд▓рд┐рдП, ufunc.reduceat(a, indices)
рдХреЛ ufunc.reduce(a[indices[i]:indices[i+1]])
рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рдорд╛рдорд▓рд╛ indices[i] == indices[i+1]
рд▓рд┐рдП рднреА рд╕рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдХрд┐рд╕реА рднреА рд╕рдордЭрджрд╛рд░ рдХрд╛рд░рдг рд╣реИ рдХрд┐, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, reduceat рд▓реМрдЯ рдЬрд╛рдирд╛ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ a[indices[i]]
рдХреЗ рдмрдЬрд╛рдп ufunc.reduce(a[indices[i]:indices[i+1]])
ред
рдпрд╣рд╛рдБ рднреА рдкрдВрдбреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рд╡реЗрд╕ рдореИрдХрд┐рдиреНрдиреА рдХреА рдЗрд╕реА рддрд░рд╣ рдХреА рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВред
рд╡рд╛рд╣, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднрдпрд╛рдирдХ рдФрд░ рдЯреВрдЯ рдЧрдпрд╛ рд╣реИред
ред
рд╣рдореЗрдВ рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдкрд░ рдХреБрдЫ рдЪрд░реНрдЪрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдореИрдВ рдХрдо рд╕реЗ рдХрдо рд╣реЛрдЧрд╛
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬ рдореЗрдВ FutureWarning рдХреЛ рдореБрджреНрджрд╛ рдмрдирд╛рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реИ
рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХреБрдЫ рд╕рдордп рдмрд╛рдж рдареАрдХ рдХрд░рдирд╛ред рд╣рдореЗрдВ рдХрд┐рд╕реА рдХреЛ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА
рдЙрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдкреИрдЪ рд▓рд┐рдЦрдиреЗ рдкрд░ рдиреЗрддреГрддреНрд╡ рдХрд░реЗрдВред рд╢рд╛рдпрдж рддреБрдо рд╣реА рд╣реЛ?
рд╕рд╣рд╛рдпрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЕрдЧрд░ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ рддреЛ рдореИрдВ рдПрдХ рдЪрд░реНрдЪрд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╕реА рдХреЛрдб рдХреЛ рдкреИрдЪ рдЕрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИред
рдЖрдк рдмрд┐рдирд╛ рдкрд╣рдЪрд╛рди рдХреЗ ufuncs рдХрд╛ рдХреНрдпрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ np.maximum?
рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЦрд╛рд▓реА рдХрдореА рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ
рдЬрдм рдЖрдк .reduceat () рдХреЗ рдмрдЬрд╛рдп .reduce () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ ufunc.reduce(a[indices[i]:indices[i+1]])
рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рд╣реЛрдЧреАред рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдирдП рдбрд┐рдЬрд╛рдЗрди рдирд┐рд░реНрдгрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЦрдбрд╝реЗ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдЬрдм рддрдХ рдХреЛрдИ рднреА рдореМрдЬреВрджрд╛ рдЕрд╕рдВрдЧрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рд╣реА рдирд╣реАрдВ рдард╣рд░рд╛ рд╕рдХрддрд╛ред
@njsmith рдореИрдВ Numpy рд╕реВрдЪреА рдореЗрдВ рд╕рд╛рдЗрди рдЕрдк рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реВрдВред рдореИрдВрдиреЗ рдпрд╣рд╛рдБ рдЕрдкрдирд╛ рдкрддрд╛ рднреЗрдЬрд╛ https://mail.scipy.org/mailman/listinfo/numpy-discussion рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХрднреА рдХреЛрдИ "рдИрдореЗрд▓ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдХрдиреНрдлрд░реНрдореЗрд╢рди" рдирд╣реАрдВ рдорд┐рд▓реАред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреЛ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ...
@divenex : рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЕрдкрдиреЗ рд╕реНрдкреИрдо рдлрд╝реЛрд▓реНрдбрд░ рдХреА рдЬрд╛рдВрдЪ рдХреА? (рдореИрдВ рд╣рдореЗрд╢рд╛ рдРрд╕рд╛ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддрд╛ рд╣реВрдВ ...) рдЕрдиреНрдпрдерд╛ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред "рдПрдХ рдИрдореЗрд▓ рдкрддрд╛" рд╕реЗ рдкрд░реЗ рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдмреЛрд▓реЗрдВ рдФрд░ рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд sysadmin рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ ... рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЯреВрдЯ рдЧрдпрд╛ рд╣реИред
рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг reduceat
рдХрд┐ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИ ufunc.reduce(a[indices[i]:indices[i+1]])
рд╕рдЪ рдореЗрдВ, рд╕рдЪ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЗрддрдирд╛ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛! рдпрд╛ рддреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реНрдХ рдпрд╛ рдПрдХ рдирдпрд╛ рдХрд╛рд░реНрдп ( reduce_intervals
? reduce_segments
? ...?) рдкреАрдЫреЗ рдХреА рдЕрд╕рдВрдЧрддрд┐ рдХреЛ рддреЛрдбрд╝рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рд╣реЛрдЧрд╛ред
рдореИрдВ рд╢рд╛рдпрдж np.ufunc.reduceat
рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реБрднрд╛рдпрд╛ рдЬрд╛рдКрдВрдЧрд╛ - рдпрд╣ рдЙрди рдорд╛рдорд▓реЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рдФрд░ рдЕрдВрдд рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд▓рдЧрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ indices[i] > indices[i+1]
ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд╛рдо at
at
рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдорд╛рдирддрд╛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ
рдореИрдВ рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░реВрдБрдЧрд╛ np.piecewise_reduce
np.reducebins
np.piecewise_reduce
np.reducebins
np.piecewise_reduce
np.reducebins
, рд╕рдВрднрд╡рддрдГ рд╢реБрджреНрдз-рдЕрдЬрдЧрд░, рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдХрд░рддрд╛ рд╣реИ:
def reducebins(func, arr, start=None, stop=None, axis=-1, out=None):
"""
Compute (in the 1d case) `out[i] = func.reduce(arr[start[i]:stop[i]])`
If only `start` is specified, this computes the same reduce at `reduceat` did:
`out[i] = func.reduce(arr[start[i]:start[i+1]])`
`out[-1] = func.reduce(arr[start[-1]:])`
If only `stop` is specified, this computes:
`out[0] = func.reduce(arr[:stop[0]])`
`out[i] = func.reduce(arr[stop[i-1]:stop[i]])`
"""
# convert to 1d arrays
if start is not None:
start = np.array(start, copy=False, ndmin=1, dtype=np.intp)
assert start.ndim == 1
if stop is not None:
stop = np.array(stop, copy=False, ndmin=1, dtype=np.intp)
assert stop.ndim == 1
# default arguments that do useful things
if start is None and stop is None:
raise ValueError('At least one of start and stop must be specified')
elif stop is None:
# start only means reduce from one index to the next, and the last to the end
stop = np.empty_like(start)
stop[:-1] = start[1:]
stop[-1] = arr.shape[axis]
elif start is None:
# stop only means reduce from the start to the first index, and one index to the next
start = np.empty_like(stop)
start[1:] = stop[:-1]
start[0] = 0
else:
# TODO: possibly confusing?
start, stop = np.broadcast_arrays(start, stop)
# allocate output - not clear how to do this safely for subclasses
if not out:
sh = list(arr.shape)
sh[axis] = len(stop)
sh = tuple(sh)
out = np.empty(shape=sh)
# below assumes axis=0 for brevity here
for i, (si, ei) in enumerate(zip(start, stop)):
func.reduce(arr[si:ei,...], out=out[i, ...], axis=axis)
return out
рдЬрд┐рд╕рдХреЗ рдЕрдЪреНрдЫреЗ рдЧреБрдг рд╣реИрдВ:
np.add.reduce(arr)
np.piecewise_reduce(np.add, arr, 0, len(arr))
np.add.reduceat(arr, inds)
np.piecewise_reduce(np.add, arr, inds)
np.add.accumulate(arr)
np.piecewise_reduce(np.add, arr, 0, np.arange(len(arr)))
рдЕрдм, рдХреНрдпрд╛ рдпрд╣ __array_ufunc__
рдорд╢реАрдирд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ? рдЬрд┐рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдЙрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА func.reduce
рд╕реЗ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдПрдХрдорд╛рддреНрд░ рдореБрджреНрджрд╛ np.empty
рд▓рд╛рдЗрди рд╣реИ, рдЬреЛ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХрд┐ np.concatenate
рд╢реЗрдпрд░ рд╣реИрдВред
рдпрд╣ рдПрдХ рдПрдкреАрдЖрдИ рдХреЗ рдирдЬрд░рд┐рдП рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рд┐рд░реНрдл рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рджреЛ рд╕реЗрдЯреЛрдВ рдХреЛ reduceat
рдкрд░реНрдпрд╛рдкреНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ? рдпрджрд┐ рдпрд╣ рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рддреЛ рджреЛ рд╕реЗрдЯреЛрдВ рдХреЗ рд╕рдорд░реНрдерди рдореЗрдВ рд╡рд░реНрддрдорд╛рди PyUFunc_Reduceat
рдХреЛ рдмрджрд▓рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрдорд╛-рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдХреЛ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдореЗрдВ рдлрд╛рдпрджрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдРрд╕рд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдорд╛рд░реНрдЯреЗрди рдиреЗ ~ 1 рд╕реЗ рдЗрд╕реА рддрд░рд╣ рдХреА рдЪрд░реНрдЪрд╛ рдореЗрдВ рдЗрд╕рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛
рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЛрдВрдиреЗ 'рдЪрд░рдг' рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛:
http://numpy-discussion.10968.n7.nabble.com/Behavior-of-reduceat-td42667.html
рдЪреАрдЬреЗрдВ рдЬреЛ рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИрдВ (рдЗрд╕рд▓рд┐рдП +1 рдпрджрд┐ рдХреЛрдИ рднреА рдЧрд┐рди рд░рд╣рд╛ рд╣реИ) рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ:
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдирдП рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬреЗрдВ рд╣реИрдВ:
рдФрд░ рдмрд╛рдЗрдХ рд╢реЗрдбрд┐рдВрдЧ рд╡рд┐рднрд╛рдЧ рд╕реЗ, рдореБрдЭреЗ рдмреЗрд╣рддрд░ рдкрд╕рдВрдж рд╣реИ:
рдЬреИрдореЗ
Thu рдкрд░, рдЕрдкреНрд░реИрд▓ 13, 2017 рдХреЛ 1:47 рдЕрдкрд░рд╛рд╣реНрди, рдПрд░рд┐рдХ рд╡реАрд╕рд░ рд╕реВрдЪрдирд╛рдПрдБ @ithub.com
рд▓рд┐рдЦрд╛ рдерд╛:
рдореИрдВ рд╢рд╛рдпрдж np.ufunc.reduceat рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ - рдпрд╣
рд╢реБрд░реВ рдФрд░ рдЕрдВрдд рд╕реВрдЪрдХ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд▓рдЧрддрд╛ рд╣реИ
рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рд╕реЗ рдмрдЪреЗрдВ рдЬрд╣рд╛рдВ рд╕реВрдЪрдХрд╛рдВрдХ [i]> рд╕реВрдЪрдХрд╛рдВрдХ [i + 1]ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, nameatsugpts рдПрдХ
рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдорд╛рдирддрд╛ toat` рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдореМрдЬреВрдж рд╣реИрдореИрдВ рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░реВрдВрдЧрд╛, рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ np.piecewise_reduce рд╣реИ
рдХрд░ рджреЗрддрд╛ рд╣реИ:def piece__reduce (рдлрд╝рдВрдХ, рдЧрд┐рд░рдлреНрддрд╛рд░реА, start_indices = рдХреЛрдИ рдирд╣реАрдВ, end_indices = рдХреЛрдИ рдирд╣реАрдВ, рдЕрдХреНрд╖ = -1, рдЖрдЙрдЯ = рдХреЛрдИ рдирд╣реАрдВ):
рдЕрдЧрд░ start_indices рдХреЛрдИ рдирд╣реАрдВ рд╣реИ рдФрд░ end_indices рдХреЛрдИ рдирд╣реАрдВ рд╣реИ:
start_indices = np.array ([0], dtype = np.intp)
end_indices = np.array (arr.shape [рдЕрдХреНрд╖], dtype = np.intp)
elif end_indices рдХреЛрдИ рдирд╣реАрдВ:
end_indices = np.empty_like (start_indices)
end_indices [: - 1] = start_indices [1:]
end_indices [-1] = arr.shape [рдЕрдХреНрд╖]
elif start_indices рдХреЛрдИ рдирд╣реАрдВ рд╣реИ:
start_indices = np.empty_like (рдПрдВрдб_рдЗрдВрдбрд┐рд╕)
start_indices [1:] = end_indices
end_indices [0] = 0
рдЕрдиреНрдп:
рдПрд╕реЗрд░ рд▓реЗрди (start_indices) == рд▓реЗрди (рдПрдВрдб_рдЗрдВрдбрд┐рд╕)if not out: sh = list(arr.shape) sh[axis] = len(end_indices) out = np.empty(shape=sh) # below assumes axis=0 for brevity here for i, (si, ei) in enumerate(zip(start_indices, end_indices)): func.reduce(arr[si:ei,...], out=alloc[i, ...], axis=axis) return out
рдЬрд┐рд╕рдХреЗ рдЕрдЪреНрдЫреЗ рдЧреБрдг рд╣реИрдВ:
- np.ufunc.reduce np.piecewise_reduce (func, arr, 0,) рдХреЗ рд╕рдорд╛рди рд╣реИред
рд▓реЗрди (рдЖрдЧрдорди))- np.ufunc.accumulate `np.piecewise_reduce (func, arrest,) рдХреЗ рд╕рдорд╛рди рд╣реИ
np.zeros (len (arr)), np.arange (len (arr)))рдЕрдм, рдХреНрдпрд╛ рдпрд╣ __array_ufunc__ рдорд╢реАрдирд░реА рд╕реЗ рдЧреБрдЬрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ? рдЬреНрдпрд╛рджрд╛рддрд░
рдХреНрдпрд╛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА func.reduce рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдж
рдХреЗрд╡рд▓ рд╕рдорд╕реНрдпрд╛ np.empty рд▓рд╛рдЗрди рд╣реИ, рдЬреЛ рдХрд┐ np.concatenate рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ
рд╢реЗрдпрд░реЛрдВред-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЗрд╕ рдзрд╛рдЧреЗ рдХреА рд╕рджрд╕реНрдпрддрд╛ рджреА рдЧрдИ рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/numpy/numpy/issues/834#issuecomment-293867746 , рдпрд╛ рдореНрдпреВрдЯ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/ADMGdtjSCodONyu6gCpwofdBaJMCIKa-ks5rvgtrgaJpZM4ANcqc
ред
-
(__ /)
(рдК)
(> <) рдПрд╕реНрдЯреЗ рдПрд╕ рдХреЛрдирдЬреЛред рдХреЛрдкрд┐рдпрд╛ рдП рдХреЛрдиреЛрдЬреЛ рдПрди рддреВ рдлрд╝рд░рдорд╛ рд╡рд╛рдИ рдЕрдпреНрдпреВрдбреЗрд▓ рдПрди рд╕рд╕ рдкреНрд▓реЗрди
рдбреА рдбреЛрдорд┐рд╕рд┐рдУрди рдореНрдпреВрдВрдбрд┐рдпрд▓ред
'рд╕реНрдЯрд╛рд░реНрдЯ' рдФрд░ 'рд╕реНрдЯреЙрдк' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдХрд┐рдпрд╛ рд╣реБрдЖ
рдХреНрдпрд╛ рд╣рдореЗрдВ make рд╕реНрдЯреЗрдк тАЩрдХреЛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рдВрдХреАрд░реНрдг рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ
рдХреНрдпрд╛ рдпрд╣ рдЗрдВрдбреЗрдХреНрд╕ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдпрд╛ рдЙрдиреНрд╣реЗрдВ 1 рдбреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ред > 1 рдбреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЦрд░рд╛рдм рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ 0 рдбреА рдФрд░ рдкреНрд░рд╕рд╛рд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рд╕рдВрдЪрдп рдХреЗ рдорд╛рдорд▓реЗред
рдпрд╣ рдПрдХ np рдлрд╝рдВрдХреНрд╢рди, рдпрд╛ рдПрдХ ufunc рд╡рд┐рдзрд┐ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ
рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ)
рд╣рд░ ufunc рд╡рд┐рдзрд┐ __array_ufunc__
рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЪреАрдЬрд╝ рд╣реИред
reduceat
рд▓рд┐рдП рдореБрдЦреНрдп рдкреНрд░реЗрд░рдгрд╛ рдЕрдзрд┐рдХрддрдо рдЧрддрд┐ рдХреЗ рд▓рд┐рдП reduce
рд╕реЗ рдЕрдзрд┐рдХ рд▓реВрдк рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ reduce
рдкрд░ рд▓реВрдк рдХреЗ рд▓рд┐рдП рдПрдХ рд░реИрдкрд░ Numpy рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдпрд╣ reduceat
рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд╡рд┐рд░реБрджреНрдз рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ reduceat
рдЕрд╕реНрддрд┐рддреНрд╡ рдФрд░ рдПрдкреАрдЖрдИ, рдкрд░ рдПрдХ рдкрд╛рд╢ рдХреЗ рд▓рд┐рдП рдПрдХ рддреЗрдЬреА рд╕реЗ vectorized рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХреЗ рд░реВрдк рдореЗрдВ reduce
, рд╕реНрд╡рдЪреНрдЫ рдФрд░ рдЙрдкрдпреЛрдЧреА рд╣реИред рдореИрдВ рдЗрд╕реЗ рдЕрдкрджрд╕реНрде рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдмрд▓реНрдХрд┐ рдЗрд╕реЗ рдареАрдХ рдХрд░реВрдВрдЧрд╛ред
reduceat
рдЧрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рдорд╛рди, рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рд╣реИ, рдЬрд╣рд╛рдВ рдореИрдВ reduceat
рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:
n = 10000
arr = np.random.random(n)
inds = np.random.randint(0, n, n//10)
inds.sort()
%timeit out = np.add.reduceat(arr, inds)
10000 loops, best of 3: 42.1 ┬╡s per loop
%timeit out = piecewise_reduce(np.add, arr, inds)
100 loops, best of 3: 6.03 ms per loop
рдпрд╣ 100x рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рд╕рдордп рдЕрдВрддрд░ рд╣реИ рдФрд░ reduceat
рджрдХреНрд╖рддрд╛ рдХреЗ рд╕рдВрд░рдХреНрд╖рдг рдХреЗ рдорд╣рддреНрд╡ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред
рд╕рд╛рд░рд╛рдВрд╢ рдореЗрдВ, рдореИрдВ рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдкрд░ reduceat
рдлрд┐рдХреНрд╕рд┐рдВрдЧ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреВрдВрдЧрд╛ред
рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА start_indices
рдФрд░ end_indices
, рдЕрдХреНрд╕рд░ рдмреЗрдорд╛рдиреА рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЬреЛрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореМрдЬреВрджрд╛ reduceat
рдЕрд╕рдВрдЧрдд рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рд╡реНрдпрд╡рд╣рд╛рд░ред
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд░рдгрд┐рдпреЛрдВ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ
рд╕реА рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╣реЛрдиреЗ рдкрд░ рджрдХреНрд╖рддрд╛ рдореЗрдВ рдмрдбрд╝рд╛ рдЕрдВрддрд░ рд╣реЛрдЧрд╛ред
13 рдЕрдкреНрд░реИрд▓ 2017 рдХреЛ 23:40 рдмрдЬреЗ, divenex рд╕реВрдЪрдирд╛рдПрдВ @github.com рдиреЗ рд▓рд┐рдЦрд╛:
Reduceat рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдкреНрд░реЗрд░рдгрд╛ рдХрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рд╢ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ
рдЕрдзрд┐рдХрддрдо рдЧрддрд┐ред рдЗрд╕рд▓рд┐рдП рдореИрдВ рд▓реВрдк рдУрд╡рд░ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд░реИрдкрд░ рдирд╣реАрдВ рд╣реВрдВ
рдХрдо рдХрд░рдирд╛ Numpy рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдЬрд╛рдПрдЧрд╛
рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдХрдо рдХрд░рдирд╛редрдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рддрд░реНрдХ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдФрд░ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ, рдПрдХ рддреЗрдЬ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ
рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рд╢ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди, рд╕реНрд╡рдЪреНрдЫ рдФрд░ рдЙрдкрдпреЛрдЧреА рд╣реИред рдореИрдВ рдирд╣реАрдВ
рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВредReduceat рдЧрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЖрдЗрдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕рдорд╛рди
рдореЗрд░реЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдореИрдВ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:n = 10000
arr = np.random.random (n)
inds = np.random.randint (0, n, n // 10)
inds.sort ()
% рд╕рдордп рд╕рдорд╛рдкреНрдд = np.add.reduceat (рдЧрд┐рд░рдлреНрддрд╛рд░реА, inds) 10000 рд▓реВрдк, 3 рдХрд╛ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда: 42.1 рдкреНрд░рддрд┐ рд▓реВрдк
% рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ = piecewise_reduce (np.add, рдЧрд┐рд░рдлреНрддрд╛рд░реА, inds) 100 рд▓реВрдк, рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда 3: 6.03 рдПрдордПрд╕ рдкреНрд░рддрд┐ рд▓реВрдкрдпрд╣ 100x рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рд╕рдордп рдЕрдВрддрд░ рд╣реИ рдФрд░ рдорд╣рддреНрд╡ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ
рдкреБрдирд░реНрдирд╡реАрдиреАрдХрд░рдг рджрдХреНрд╖рддрд╛ рдХрд╛ рд╕рдВрд░рдХреНрд╖рдгредрд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореИрдВ рдирдП рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдкрд░ рдкреБрди: рдирд┐рд░реНрдзрд╛рд░рдг рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреВрдВрдЧрд╛
рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИредрдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдХ start_indices рдФрд░ end_indices, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИ
рдЕрдХреНрд╕рд░ рдирд┐рд░рд░реНрдердХ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдЬреЛрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдлрд┐рдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ
рд╡рд░реНрддрдорд╛рди рдкреБрдирд░реНрд╡рд┐рдХрд╛рд╕ рдЕрд╕рдВрдЧрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдПред-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/numpy/numpy/issues/834#issuecomment-293898215 , orute
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AAEz6xPex0fo2y_MqVHbNP5YNkJ0CBJrks5rviW-gaJpZM4ANcqc
ред
рдпрд╣ 100x рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рд╕рдордп рдЕрдВрддрд░ рд╣реИ рдФрд░ Reduceat рджрдХреНрд╖рддрд╛ рдХреЗ рд╕рдВрд░рдХреНрд╖рдг рдХреЗ рдорд╣рддреНрд╡ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ reduce
рдХреЙрд▓ рдХреЗ рдкрд╣рд▓реЗ рдЪрд░рдг рд╕реЗ рдЬреБрдбрд╝реЗ рдУрд╡рд░рд╣реЗрдб рдХреЛ рдХрдо рдХрд░рдХреЗ рдЖрдВрдХрд╛ рдерд╛ (рдпрд╣ рдХреЗрд╡рд▓ reduceat
рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рд╣реЛрддрд╛ рд╣реИ)ред
рдПрдХ рдирд┐: рд╢реБрд▓реНрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╢реБрджреНрдз рдЕрдЬрдЧрд░ рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рддрд░реНрдХ рд╣реИ
рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдЕрд╕рдВрдЧрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдп рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВред
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ, рдХрд┐ рдпрд╣ рдХреЛрдб рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдЬреЛ рдЗрддрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╣рд╛ рд╣реИред
рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рд╕реНрддрд╛рд░: рдЬрдм indices[i] > indices[j]
, рд╡реНрдпреБрддреНрдХреНрд░рдо рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ:
for i, (si, ei) in enumerate(zip(start, stop)):
if si >= ei:
func.reduce(arr[si:ei,...], out=out[i, ...], axis=axis)
else:
func.reduce(arr[ei:si,...], out=out[i, ...], axis=axis)
func.inverse(func.identity, out[i, ...], out=out[i, ...])
рдЬрд╣рд╛рдВ np.add.inverse = np.subtract
, np.multiply.inverse = np.true_divide
ред рдпрд╣ рдЕрдЪреНрдЫреА рд╕рдВрдкрддреНрддрд┐ рд╣реИ рдХрд┐ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рд╣реИ
func.reduce(func.reduceat(x, inds_from_0)) == func.reduce(x))
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
a = [1, 2, 3, 4]
inds = [0, 3, 1]
result = np.add.reduceat(a, inds) # [6, -5, 9] == [(1 + 2 + 3), -(3 + 2), (2 + 3 + 4)]
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ, рдХрд┐ рдпрд╣ рдХреЛрдб рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдЬреЛ рдЗрддрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╣рд╛ рд╣реИред
рдпрд╣ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ рдХрд┐ рдИ-рдореЗрд▓ рдереНрд░реЗрдб рдореЗрдВ рдореИрдВрдиреЗ рд╕реВрдЪрдХ рдХреЛ 2-рдбреА рд╕рд░рдгреА рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдЕрд░реНрде рджреЗрдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрдпрд╛рдо 2 рдпрд╛ 3 рд╣реИ: рдпрд╣ рддрдм (рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ) рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рдвреЗрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд╛рддреА рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рднреА рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реИ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ reduce_by_slice
, slicereduce
, рдпрд╛ reduceslice
рд╡рд┐рдзрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред
ps рдореБрдЭреЗ рдРрд╕рд╛ рдХреБрдЫ рднреА рд▓рдЧрддрд╛ рд╣реИ рдЬреЛ рдХрдИ ufuncs рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдПрдХ рд╡рд┐рдзрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рдЗрд╕реЗ __array_ufunc__
рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рджрд░рдЕрд╕рд▓, рдПрдХ рдЕрд▓рдЧ рд╕реБрдЭрд╛рд╡ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИ: reduceat
рдмрдЪрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдХреНрдпреЛрдВ рди slice
рддрд░реНрдХ (рдпрд╛ start
, stop
, step
) ufunc.reduce
? рдЬреИрд╕рд╛ рдХрд┐ @ eric-wieser рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо reduceat
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдШрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдЕрднреА рд╣реЛрдЧрд╛ред
add.reduce(array, slice=slice(indices[:-1], indices[1:])
(рдЬрд╣рд╛рдВ рдЕрдм рд╣рдо рдЦрд╛рд▓реА рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ рдЙрд╕рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ)
рдпрд╣рд╛рдБ, рдпрджрд┐ рдпрд╣ 0-d рдерд╛, рддреЛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛, рдФрд░ рдпрджрд┐ рдПрдХ рдХреБрд▓реНрд╣рд╛рдбрд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рдЧреБрдЪреНрдЫреЗ рдореЗрдВ рдЧреБрдЬрд░рдиреЗ рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдКрдкрд░ slice(indices[:-1], indices[1:])
рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рдПрдХ рдЯрдкрд▓ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП ( slice
рдордирдорд╛рдирд╛ рдбреЗрдЯрд╛ рдкрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛)ред
рдореИрдВ рдЕрднреА рднреА reduceat
рдПрдХ рдлрд┐рдХреНрд╕ рдкрд╛рдКрдВрдЧрд╛, рдЗрд╕реЗ reduce
рдХрд╛ рд╕рдмрд╕реЗ рдЙрдЪрд┐рдд 100% рд╡реЗрдХреНрдЯрд░рдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рддрд╛рд░реНрдХрд┐рдХ рдбрд┐рдЬрд╛рдЗрди рд╕рдорд╛рдзрд╛рдиред рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдмреНрд░реЗрдХрд┐рдВрдЧ рдХреЛрдб рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП (рд▓реЗрдХрд┐рди рдиреАрдЪреЗ рджреЗрдЦреЗрдВ), reducebins
рдЬреИрд╕реА рдПрдХ рд╕рдорддреБрд▓реНрдп рд╡рд┐рдзрд┐ рдмрдирд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬреЛ рдХрд┐ reduceat
рдПрдХ рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ @ eric-wieser рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ reduceat
рдХрд╛ рдирд╛рдордХрд░рдг at
рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЕрдзрд┐рдХ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рдХреЛрдб рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╕рдордЭрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореБрдЭреЗ рдкреБрд░рд╛рдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдХрдард┐рди рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рддрд╛рд░реНрдХрд┐рдХ рдЕрд░реНрде рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдЗрд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рдмрдЧ рдХрд╣реВрдВрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ reduceat
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдХреА рдЙрдореНрдореАрдж рд╣реЛрдЧреА рдХрд┐ indices
рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдирд╣реАрдВ рдереЗ, reduceat
рд╕реЗ рдПрдХ рдмрдХрд╡рд╛рд╕ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдореИрдВрдиреЗ out[:-1] *= np.diff(indices) > 0
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛
рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ @mhvk slice
рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ slice
рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреИрд░-рдорд╛рдирдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ reduce
рдХреЗ рдореМрдЬреВрджрд╛ рдбрд┐рдЬрд╛рдЗрди рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реЛрдЧрд╛, рдЬреЛ _ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде ufunc рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдПрдХ рдЖрдпрд╛рдо рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред "_
рдореИрдВ рджреЛрдиреЛрдВ start
рдФрд░ end
рд╕реВрдЪрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдореНрдореЛрд╣рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рджреЗрдЦрддрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рд╡рд░реНрддрдорд╛рди рдХреА рдЕрдЪреНрдЫреА рдбрд┐рдЬрд╛рдЗрди рддрд░реНрдХ рджреЗрдЦрдирд╛ reduceat
рдзрд╛рд░рдгрд╛рддреНрдордХ рдХреЗ рд╕рдорд╛рди рд╡рд┐рдзрд┐ np.histogram
, рдЬрд╣рд╛рдВ bins
, рдЬреЛ _ "рдмрд┐рди рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ," _ рдиреЗ рд▓реЗ рд▓реА рд╣реИ indices
, рдЬреЛ рдбрд┐рдмреНрдмреЗ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХрд╛ рднреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореВрд▓реНрдп рдХреЗ рдмрдЬрд╛рдп рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдерд╛рди рдореЗрдВред рдФрд░ reduceat
рдмрд┐рдиреНрд╕ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбрд╝реА рдХреЗ рдЕрдВрджрд░ рдирд┐рд╣рд┐рдд рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рдПрдХ рдмреЗрд╣рдж рд▓реЛрдХрдкреНрд░рд┐рдп рдирд┐рд░реНрдорд╛рдг рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдирдореНрдкреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рджреЛ рд╡реИрдХреНрдЯрд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдкред рдЙрд╕реА рд░реАрдЬрд╝рди рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ reduceat
рдпрд╛ рдЗрд╕рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдореЗрдВ рджреЛрдиреЛрдВ рдХрд┐рдирд╛рд░реЛрдВ рдХреА рдордЬрдмреВрдд рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
Reduceat рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдкреНрд░реЗрд░рдгрд╛ рдЕрдзрд┐рдХрддрдо рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдЕрдзрд┐рдХ рд▓реВрдк рд╕реЗ рдмрдЪрдирд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реВрдк рдХреЗ рд▓рд┐рдП рдПрдХ рд░реИрдкрд░ рдирдореНрдкреА рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЛрдЧрд╛ред рдпрд╣ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдЧрд╛ред
рдореИрдВ рдпрд╣рд╛рдБ @divenex рд╕реЗ рд╕рд╣рдордд рд╣реВрдБред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ reduceat
рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ рдПрдХ рдЙрдЪрд┐рдд рдмрд╛рдзрд╛ рд╣реИ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд▓реВрдк рдХреЛ рдбреЗрдЯрд╛ рдкрд░ рдПрдХрд▓ рдкрд╛рд╕ рдХреЗ рд╕рд╛рде рдХреИрд╢ рдХреБрд╢рд▓ рддрд░реАрдХреЗ рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдпрджрд┐ рдЖрдк рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ рдбрд┐рдмреНрдмреЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдЪрд╛рд▓рди (рдЬреИрд╕реЗ, рд░реЛрд▓рд┐рдВрдЧ рд╡рд┐рдВрдбреЛ рдПрдХрддреНрд░реАрдХрд░рдг) рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╣реИрдВред
рдореИрдВ рдпрд╣ рднреА рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдмрд╕реЗ рд╕рд╛рдл рд╕рдорд╛рдзрд╛рди рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде reducebins
(рдФрд░ reduceat
), рдФрд░ reduce
рдореЗрдВ рдЗрд╕реЗ рдирд┐рдЪреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рди рдХрд░реЗрдВред
рд╣реЗрд▓реЛ рд╕рдм рд▓реЛрдЧ,
рдореИрдВ рдХрд▓реА рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИред рдпрд╣ docstring рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ:
For i in ``range(len(indices))``, `reduceat` computes
``ufunc.reduce(a[indices[i]:indices[i+1]])``, which becomes the i-th
generalized "row" parallel to `axis` in the final result (i.e., in a
2-D array, for example, if `axis = 0`, it becomes the i-th row, but if
`axis = 1`, it becomes the i-th column). There are three exceptions to this:
* when ``i = len(indices) - 1`` (so for the last index),
``indices[i+1] = a.shape[axis]``.
* if ``indices[i] >= indices[i + 1]``, the i-th generalized "row" is
simply ``a[indices[i]]``.
* if ``indices[i] >= len(a)`` or ``indices[i] < 0``, an error is raised.
рдЬреИрд╕реЗ, рдореИрдВ reduceat
рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдпрд╛рд╕ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░рддрд╛ рд╣реВрдВред
рдПрдХ рддреНрд╡рд░рд┐рдд рдЬреАрдереБрдм рдЦреЛрдЬ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрдИ, рдХрдИ рдЙрдкрдпреЛрдЧ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣рд╛рдВ рд╣рд░ рдХреЛрдИ рдирд┐рд╢реНрдЪрд┐рдд рд╣реИ рдХрд┐ рд╡реЗ рд╕рднреА рдХреЗрд╡рд▓ рд╕рдЦреНрддреА рд╕реЗ рдмрдврд╝рддреЗ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ?
рдПрдХ рдирдП рдХрд╛рд░реНрдп рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢реБрд░реВ / рдмрдВрдж рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛, рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЧрдВрднреАрд░ рд░реВрдк рд╕реЗ рдмрд╛рдзрд┐рдд рд╣реИред рдРрд╕реА рдХрдИ рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рд╣реИрдВ, рдЬрд╣рд╛рдБ рдХреЛрдИ рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдорд╛рдкрдирд╛ рдЪрд╛рд╣реЗрдЧрд╛ рдЬреЛ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд╕рд░рдгреА рдирд╣реАрдВ рд╣реИ (рдЗрд╕рд▓рд┐рдП рд░реЛрд▓рд┐рдВрдЧ рд╡рд┐рдВрдбреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреА)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рд╕реНрд╡рддрдВрддреНрд░ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдмреНрдпрд╛рдЬ рдХреЗ рдХреНрд╖реЗрддреНрд░ред рдФрд░ @divenex рдиреЗ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ рдХрд┐ рдкрд╛рдпрдерди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдкреНрд░рджрд░реНрд╢рди рдЕрдВрддрд░ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдРрд╕реА рдХрдИ рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рд╣реИрдВ, рдЬрд╣рд╛рдБ рдХреЛрдИ рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдорд╛рдкрдирд╛ рдЪрд╛рд╣реЗрдЧрд╛ рдЬреЛ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд╕рд░рдгреА рдирд╣реАрдВ рд╣реИ (рдЗрд╕рд▓рд┐рдП рд░реЛрд▓рд┐рдВрдЧ рд╡рд┐рдВрдбреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреА)ред
рд╣рд╛рдВ, рд▓реЗрдХрд┐рди рдЖрдк рдПрдХ рднреЛрд▓реЗ рдкрд╛рд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬреИрд╕реЗ рдХрд┐ reduceat
рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд░реЛрд▓рд┐рдВрдЧ рд╡рд┐рдВрдбреЛ рдХреА рдЧрдгрдирд╛ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдордзреНрдпрд╡рд░реНрддреА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдбреЗрдЯрд╛ рдкрд░ рдПрдХрд▓ рд░реИрдЦрд┐рдХ рдкрд╛рд╕ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдПрдХ рдРрд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ reduceat
рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред
@shoyer рдореИрдВ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдХреЗрд╡рд▓ рдХреБрдЫ ROI рдУрд╡рд░рд▓реИрдк рд╣реЛ рд░рд╣реЗ рд╣реИрдВред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдПрдХ рд╕реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд▓рд┐рдЦрдирд╛ рднрд╛рд░реА рдУрд╡рд░рдХрд┐рд▓ рд╣реЛрдЧрд╛ред рдЖрдЗрдП рд╣рдо рдпрд╣ рди рднреВрд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдореБрдЦреНрдп рдпреВрдЬрд░рдмреЗрд╕ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рд╣реИрдВ, рдЬреЛ рдЖрдо рддреМрд░ рдкрд░ рдЧрд░реАрдм рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ "рдЕрдЪреНрдЫреЗ рдкрд░реНрдпрд╛рдкреНрдд" рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рди рдХрд┐ рдкреВрд░реНрдг рдЗрд╖реНрдЯрддрдоред np.reduceat
рдЬрдЯрд┐рд▓рддрд╛ рд╕реЗ рдЬреБрдбрд╝реЗ рдХрдо рдирд┐рд░рдВрддрд░ рдХрд╛рд░рдХреЛрдВ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╢реБрджреНрдз рдкрд╛рдпрдерди рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдХрдард┐рди рдпрд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ - рдЕрдХреНрд╕рд░ рдХреЗрд╡рд▓ рдХреЛрдб рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВред
@ рдЬрдиреА рдЬрд╝рд░реВрд░, рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╢реБрд░реБрдЖрдд рдФрд░ рд╕реНрдЯреЙрдк рдХреЗ рд╕рд╛рде рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдХрдо рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдХреЛрдк рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡реГрджреНрдзрд┐ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ reduceat
(рдЬрд┐рд╕реЗ рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рд╣рдо рдЗрд╕реЗ рдХрднреА рди рд╣рдЯрд╛рдПрдВ) рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рдмрдЬрд╛рдп рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рдзрд┐ рдХреЗ рдЕрдиреБрдХреВрд▓ рдХреБрдЫ рдмреЗрд╣рддрд░ рд╣реЛред
рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдФрд░ рд░реБрдХрдиреЗ рд╡рд╛рд▓реЗ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдХрдо рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡реГрджреНрдзрд┐ рд╣реИ
рдпрд╣ рдореБрдЭреЗ рдмрд╣реБрдд рдорд╛рдореВрд▓реА рд▓рдЧрддрд╛ рд╣реИред рдЕрднреА, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдб рд╣реИ рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ ind1 = indices[i], ind2 = indices[i + 1]
ред рдПрдХ рд╣реА рдХреЗ рдмрдЬрд╛рдп рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рдирд╛ рдмрд╣реБрдд рдХрдо рдкреНрд░рдпрд╛рд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдФрд░ рдПрдХрд▓-рдкрд╛рд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдЬрдм рдкрд╛рд░рд┐рдд рд╕рдиреНрдирд┐рд╣рд┐рдд рд╕реАрдорд╛рдПрдВ рд▓рдЧрднрдЧ рдЙрддрдиреА рд╣реА рддреЗрдЬреА рд╕реЗ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рддрдиреА рдХрд┐ рдЕрднреА рд╣реИ - рдХреЗрд╡рд▓ рдУрд╡рд░рд╣реЗрдб nditer рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рддрд░реНрдХ рд╣реИ
рдпрд╣ рдореБрдЭреЗ рдмрд╣реБрдд рдорд╛рдореВрд▓реА рд▓рдЧрддрд╛ рд╣реИред
рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ reduceat
(рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреНрдп рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдирдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЦреЛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдУрд╡рд░рд▓реИрдк рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рджреЛ-рд╕реВрдЪрдХрд╛рдВрдХ рд░реВрдк рдкреБрд░рд╛рдиреЗ (рд╡рд┐рдЪрд┐рддреНрд░) рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
def reduceat(func, arr, inds):
deprecation_warning()
start = inds
stops = zeros(inds.shape)
stops[:-1] = start[1:]
stops[-1] = len(arr)
np.add(stops, 1, where=ends == starts, out=stops) # reintroduce the "bug" that we would have to keep
return reducebins(func, arr, starts, stops)
рдорддрд▓рдм рд╣рдореЗрдВ рджреЛ рд╕рдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ starts
рдФрд░ stops
рдирдП рдирдП reducebins
рд▓рд┐рдП рдЗрдВрдбреЗрдХреНрд╕ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рд╡реЗ рджреЛрдиреЛрдВ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ np.histogram
рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдиреЗ рдФрд░ bins
рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдЬреЛрдбрд╝рдХрд░ ...
рдЕрдВрддрддрдГ, рдпрд╣ рддрдм рддрдХ рдареАрдХ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдХреЛрдИ рдЕрднреА рднреА рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рдПрдХрд▓ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдФрд░ рдЧрддрд┐ рджрдВрдб рдХреЗ рдмрд┐рдирд╛ reducebins(arr, indices)
рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдмреЗрд╢рдХ рдРрд╕реА рдХрдИ рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рд╣реИрдВ, рдЬрд╣рд╛рдБ рдХрд┐рд╕реА рдХреЛ рдиреЙрди-рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ рдбрд┐рдмреНрдмреЗ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдЙрдореНрдореАрдж рд╣реЛрдЧреА рдХрд┐ рдбрд┐рдмреНрдмреЗ рдЕрдХреЗрд▓реЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рдЬреЛрдбрд╝реЗ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрд▓рдмреНрдз рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рд╕реНрдХреИрдкреА рдХреА ndimage.sum рдФрд░ рдЗрддрдиреЗ рдкрд░ред
рд▓реЗрдХрд┐рди рдпрд╣ reducebins
рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдХрд╛рдлреА рдЕрд▓рдЧ рд▓рдЧрддрд╛ рд╣реИред
рддреЛ, starts
рдФрд░ stops
reducebins
рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
рддреЛ, рдХреНрдпрд╛ рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╢реБрд░реВ рдФрд░ рд╕реНрдЯреЙрдкрдмрд┐рди рдореЗрдВ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛?
рдЕрдиреНрдп рдорд╛рдзреНрдпрдореЛрдВ рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИ, рд▓реЗрдХрд┐рди k
рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рдЪрд▓рддреЗ рдФрд╕рдд reducebins(np,add, arr, arange(n-k), k + arange(n-k))
ред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛, рдкреНрд░рджрд░реНрд╢рди as_strided
рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред
рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ, reducebins
рдмрджрд▓рддреА рдЕрд╡рдзрд┐ рдХреА рдЪрд▓рддреА рдФрд╕рдд рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЬреЛ as_strided
рд╕рд╛рде рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ - рдПрдХ-рддрд░реНрдХ рд░реВрдк рдореЗрдВ рдЕрдВрдд рдпрд╛ рд╢реБрд░реБрдЖрдд рд╕рд╣рд┐рдд рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
a = np.arange(10)
reducebins(np.add, start=[2, 4, 6]) == [2 + 3, 4 + 5, 6 + 7 + 8 + 9] # what `reduceat` does
reducebins(np.add, stop=[2, 4, 6]) == [0 + 1, 2 + 3, 4 + 5] # also useful
рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ - рдПрдХ-рддрд░реНрдХ рд░реВрдк рдореЗрдВ рдЕрдВрдд рдпрд╛ рд╢реБрд░реБрдЖрдд рд╕рд╣рд┐рдд рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ред
рдореИрдВ рдЗрд╕реЗ рдмрд╣реБрдд рдирд╣реАрдВ рд╕рдордЭрддрд╛ред рдХреНрдпрд╛ рдЖрдк рдпрд╣рд╛рдВ рдЗрдирдкреБрдЯ рдЯреЗрдВрд╕рд░ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛: start
/ stop
рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
рд╡реИрд╕реЗ рднреА, рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реНрдХреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдл рдирд╣реАрдВ рд╣реИред рдореИрдВ рдпрд╣ рдХрд╣рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ "рд░рд┐рдбреНрдпреВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрдо-рд╕реЗ-рдХрдо рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ" рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рджрд┐рдЦрдиреЗ рдкрд░ рдпрд╣ рдереЛрдбрд╝рд╛ рдХрдард┐рди рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореБрдЭреЗ рдмрд╕ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдПрдХ рд╕реНрдЯрд╛рд░реНрдЯ / рд╕реНрдЯреЙрдк рд╡рд┐рдХрд▓реНрдк рднреА рдЦрд╛рд▓реА рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЕрддреАрдд рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд░рд╣рд╛ рд╣реИ: рдЬрдм рдореЗрд░реЗ рдЧреБрдг / рд▓реЗрдмрд▓ рдПрдХ рд╕реАрдПрд╕рдЖрд░ рд╡рд┐рд░рд▓ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдореИрдВ рдХрдореА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП indptr
рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред reduceat
, рдореИрдВ рдЦрд╛рд▓реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╣реАрдЦрд╛рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рддреЛ, рдЬреЛ рднреА рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЖрдк рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ reduceat
рдЖрд╕рдкрд╛рд╕ рдЫреЛрдбрд╝ рджреЗрдВред
In [2]: A = np.random.random((4000, 4000))
In [3]: B = sparse.csr_matrix((A > 0.8) * A)
In [9]: %timeit np.add.reduceat(B.data, B.indptr[:-1]) * (np.diff(B.indptr) > 1)
1000 loops, best of 3: 1.81 ms per loop
In [12]: %timeit B.sum(axis=1).A
100 loops, best of 3: 1.95 ms per loop
In [16]: %timeit np.maximum.reduceat(B.data, B.indptr[:-1]) * (np.diff(B.indptr) > 0)
1000 loops, best of 3: 1.8 ms per loop
In [20]: %timeit B.max(axis=1).A
100 loops, best of 3: 2.12 ms per loop
рд╕рдВрдпреЛрдЧ рд╕реЗ, рдЦрд╛рд▓реА рдЕрдиреБрдХреНрд░рдо рдХреЛрдиреНрдбреНрд░рдо рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдкрд╛рдпрдерди рдХрд░рддрд╛ рд╣реИ : рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдкреНрд░рджрд╛рди рдХрд░рдХреЗред рдпрд╣ indices
рдХреЗ рд╕рдорд╛рди рд╕реНрдХреЗрд▓рд░ рдпрд╛ рдЙрд╕реА рдЖрдХрд╛рд░ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛ рд╕рдХрддреА рд╣реИред
рд╣рд╛рдБ, рдореИрдВ рд╕рд╣рдордд рд╣реВрдБ рдХрд┐ рдкрд╣рд▓рд╛ рдзреНрдпрд╛рди рдЦрд╛рд▓реА рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рдорд╛рдорд▓рд╛ред рдкреНрд░рд╛рд░рдВрдн = рдЕрдВрдд рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдпрд╛ рддреЛ рдЖрдЙрдЯрдкреБрдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ
рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП рддрддреНрд╡, рдпрд╛ рдЙрддреНрдкрд╛рджрди рддрддреНрд╡ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЗ рд╕рд╛рде
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рд░рдгреАред рд╡рд░реНрддрдорд╛рди рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде
рдореИрдВ рдЙрдирдХреА рдЖрдЦрд┐рд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ @shoyer рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ
рдЪрд▓реЛ рдмрд╕ out=ufunc.reducebins(a, inds)
рдХреЛ out[i]=ufunc.reduce(a[inds[i]:inds[i+1]])
рдХреЗ рд░реВрдк рдореЗрдВ рд╕рднреА i
рдЕрдВрддрд┐рдо рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ reduceat
ред
starts
рдФрд░ ends
рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдФрд░ рд╕рдВрднрд╡рддрдГ as_strided
рдпрд╛ рд╕рдВрдХрд▓реНрдк рдЬреИрд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред
@ рд╢рд╛рдпрд░ :
рдореИрдВ рдЗрд╕реЗ рдмрд╣реБрдд рдирд╣реАрдВ рд╕рдордЭрддрд╛ред рдХреНрдпрд╛ рдЖрдк рдпрд╣рд╛рдВ рдЗрдирдкреБрдЯ рдЯреЗрдВрд╕рд░ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛: рд╕реНрдЯрд╛рд░реНрдЯ / рд╕реНрдЯреЙрдк рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ reduce_bins
рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрдЦреЗрдВред рдореИрдВрдиреЗ рд╡рд╣рд╛рдВ рдПрдХ рдбреЙрдХрд╕реНрдЯреНрд░рд┐рдВрдЧ рднреА рдЬреЛрдбрд╝рд╛ рд╣реИред рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдлреАрдЪрд░-рдкреВрд░реНрдг рд▓реЗрдХрд┐рди рдзреАрдорд╛ (рдЕрдЬрдЧрд░ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг) рд╣реИред
рд▓реЗрдХрд┐рди рдпрд╣ (рдереЛрдбрд╝рд╛) рдХрдард┐рди рд╣реИ рдЬрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрд▓рдЧ рджрд┐рдЦрддрд╛ рд╣реИред
рдЬрдм рдХреЗрд╡рд▓ рдПрдХ start
рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИ (рдкрд╣рдЪрд╛рди рдХреЗрд╕реЗрдЯреЗрдЯ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЬреЛ рд╣рдо рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ)ред рдЗрди рддреАрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдорддрд▓рдм рдПрдХ рд╣реА рд╣реИ:
np.add.reduce_at(arr, inds)
reduce_bins(np.add, arr, inds)
reduce_bins(np.add, arr, start=inds)
(рд╡рд┐рдзрд┐ / рдХрд╛рд░реНрдп рднреЗрдж рдХреБрдЫ рдРрд╕реА рдЪреАрдЬ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреА рдореИрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдЕрдЬрдЧрд░ рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдирдИ рдпреВрдлреБрдирдХ рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ!)
@ рдЬрдиреА :
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореБрдЭреЗ рдЕрднреА рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕реНрдЯрд╛рд░реНрдЯ / рд╕реНрдЯреЙрдк рд╡рд┐рдХрд▓реНрдк рднреА рдЦрд╛рд▓реА рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЕрддреАрдд рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд░рд╣рд╛ рд╣реИ
рдЖрдк рдЧрд▓рдд рд╣реИрдВ, рдпрд╣ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╣реИ рдЬреИрд╕реЗ ufunc.reduceat
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИред рдпрд╣ start[i] == end[i]
рдкрд╛рд╕ рдХрд░рдХреЗ рднреА рд╕рдВрднрд╡ рд╣реИред
рдЦрд╛рд▓реА рдЕрдиреБрдХреНрд░рдо conundrum рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ... рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдкреНрд░рджрд╛рди рдХрд░рдХреЗред
рд╣рд╛рдВ, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕реЗ рдХрд╡рд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рдФрд░ ufunc.reduce
рдкрд╣рд▓реЗ рд╣реА ufunc.identity
рд╕рд╛рде рднрд░рдХрд░ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдореМрдЬреВрджрд╛ ufunc.reduecat
рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ # 8952 рд╡рд┐рд▓рдп рд╣реЛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХрд╣рд╛, рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ _documented_ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╢рд╛рдпрдж рдЗрд╕реЗ рдирд╣реАрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред
@divenex
рдЪрд▓реЛ рдмрд╕ рдмрд╛рд╣рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ = ufunc.reducebins ((inds) рдмрд╛рд╣рд░ рдХреЗ рд░реВрдк рдореЗрдВ [i] = ufunc.reduce (рдПрдХ [inds [i]: inds [i + 1]]) рд╕рднреА рдХреЗ рд▓рд┐рдП рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо
рддреЛ len(out) == len(inds) - 1
? рдпрд╣ reduceat
рдХреЗ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ @shoyer рдХрд╛ рддрд░реНрдХ рдпрд╣рд╛рдВ рдЕрдзрд┐рдХ рдордЬрдмреВрдд рд╣реИ
рд╕рднреА: рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рдФрд░ рдЙрджреНрдзреГрдд рдИрдореЗрд▓ рдЙрддреНрддрд░реЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдмрдирд╛ рд░рд╣реЗ рдереЗ
@ eric-wieser рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рдореЗрд░реЗ рдЙрдкрд░реЛрдХреНрдд рд╡рд╛рдХреНрдп рдореЗрдВ рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛ рдХрд┐ рдЕрдВрддрд┐рдо рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд▓рд┐рдП reducebins
рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд░реНрддрдорд╛рди reduceat
рд░реВрдк рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореВрд▓реНрдп рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЕрдВрддрд┐рдо рдореВрд▓реНрдп рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред
рдЕрдиреБрдХреВрд▓рддрд╛ рд╕рдВрдмрдВрдзреА рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реБрдП, reducebins
(1D рдореЗрдВ) рдХрд╛ рдЖрдХрд╛рд░ inds.size-1
рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕реА рдХрд╛рд░рдг рд╕реЗ np.diff(a)
рдХрд╛ рдЖрдХрд╛рд░ a.size-1
рдФрд░ np.histogram(a, bins)
рдХрд╛ рдЖрдХрд╛рд░ bins.size-1
ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ reduceat
рд▓рд┐рдП рдПрдХ рдбреНрд░реЙрдк-рдЗрди рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреА рдЗрдЪреНрдЫрд╛ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЬрд╛рдПрдЧрд╛ред
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХреЛрдИ рдареЛрд╕ рддрд░реНрдХ рд╣реИ рдХрд┐ a.size-1
рд╕рд╣реА рдЙрддреНрддрд░ рд╣реИ - рдЗрд╕рдореЗрдВ рдЗрдВрдбреЗрдХреНрд╕ 0
рдФрд░ / рдпрд╛ рдЗрдВрдбреЗрдХреНрд╕ n
рднреА рдХрд╛рдлреА рдЙрдЪрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд▓рдЧрддрд╛ рд╣реИред рд╡реЗ рд╕рднреА рдХреБрдЫ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдореЗрдВ рдХрдореА рдЖрдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдпрд╣рд╛рдБ stop
/ start
рдЫрд┐рдкрдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реНрдХ рд╣реИ - рдпрд╣ рдЖрдкрдХреЛ diff
-рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдмрд╣реБрдд рдХрдо рд▓рд╛рдЧрдд рдХреЗ рд╕рд╛рде рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЕрднреА рднреА рд░рдЦ рд░рд╣реЗ рд╣реИрдВ reduceat
рд╡реНрдпрд╡рд╣рд╛рд░:
a = np.arange(10)
inds = [2, 4, 6]
reduce_bins(a, start=inds[:-1], stop=inds[1:]) # [2 + 3, 4 + 5]
# or less efficiently:
reduce_at(a, inds)[:-1}
reduce_bins(a, start=inds)[:-1]
reduce_bins(a, stop=inds)[1:]
@ eric-Wieser рдореИрдВ рдЖрд╡рд╢реНрдпрдХ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ start
рдФрд░ stop
рддрд░реНрдХ, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрдирд╛рдиреЗ рдХреА рддрд░рд╣ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ start
рдЕрд░реНрде out[i] = func.reduce(arr[start[i]:start[i+1]])
рдмрдЬрд╛рдп out[i] = func.reduce(arr[start[i]:])
, рдЬреЛ рдХрд┐ рдореИрдВрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реЛрдЧрд╛ред
рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдкрд╕рдВрджреАрджрд╛ рдПрдкреАрдЖрдИ reducebins
рдХреА рддрд░рд╣ рд╣реИ reduceat
рд▓реЗрдХрд┐рди рднреНрд░рд╛рдордХ "рдЕрдкрд╡рд╛рдж" рдореЗрдВ рдиреЛрдЯ рдХреЗ рдмрд┐рдирд╛ docstring ред рдЕрд░реНрдерд╛рддреН, рдмрд╕:
i in range(len(indices))
, reduceatufunc.reduce(a[indices[i]:indices[i+1]])
рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдзреБрд░реА рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ i-th рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд "рдкрдВрдХреНрддрд┐" рдмрди рдЬрд╛рддрд╛ рд╣реИ (рдпрд╛рдиреА, 2-рдбреА рд╕рд░рдгреА рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЕрдХреНрд╖ = 0, рдпрд╣ i-th рдкрдВрдХреНрддрд┐ рдмрди рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЕрдХреНрд╖ = 1, рддреЛ рдпрд╣ i-th рдХреЙрд▓рдо рдмрди рдЬрд╛рддрд╛ рд╣реИ)ред
рдореИрдВ рддреАрд╕рд░реЗ "рдЕрдкрд╡рд╛рдж" рдкрд░ рдЬрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ ( 0 <= indices[i] <= a.shape[axis]
) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╡рд┐рд╡реЗрдХ рдЬрд╛рдВрдЪ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рд╕рдВрднрд╡рддрдГ рдпрд╣ рдХрд┐ рдХреЛрдИ рднреА рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, - рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдирдХрд╛рд░рд╛рддреНрдордХ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдРрд╕реЗ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдгрд┐рдд рдХрд░рдирд╛ рдХрдард┐рди рдирд╣реАрдВ рд╣реИред
рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо len(a)-1
рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, np.histogram
рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рддрд░рд╣ред
@ рдЬрдиреА рдХреНрдпрд╛ рдЖрдк рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рд░рд▓
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдкреНрд░рд╛рд░рдВрдн рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ [i] = func.reduce (рдЧрд┐рд░рдлреНрддрд╛рд░ [рдкреНрд░рд╛рд░рдВрдн [i]: рдкреНрд░рд╛рд░рдВрдн [i + 1]]) рдмрд╛рд╣рд░ рдХреА рдмрдЬрд╛рдп [i] = func.reduce (рдЧрд┐рд░рдлреНрддрд╛рд░ [рдкреНрд░рд╛рд░рдВрдн [i]] :]), рдЬреЛ рдореИрдВрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реИред
рдореИрдВ рдЬрд┐рд╕ рд░реАрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЬрд╛ рд░рд╣рд╛ рдерд╛ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ "рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рди рдЗрди рдкрджреЛрдВ рдкрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ", рдЗрд╕ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рд╕рд╛рде рдХрд┐ рд╕рднреА рдбрд┐рдмреНрдмреЗ рд╕рдиреНрдирд┐рд╣рд┐рдд рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдиреНрдпрдерд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╢рд╛рдпрдж рдореБрдЭреЗ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдкреВрд░реНрдг рдбреЙрдХрд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдорд╕реМрджрд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рди рддреЛ рддрд░реНрдХ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдордЬрдмреВрдд рддрд░реНрдХ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рдорд╛рд░реЛрд╣ рд╕реЗ рдЗрд╕реЗ рд╣рдЯрд╛ рджреВрдВрдЧрд╛ред
рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (0 <= indices [i] <a.shape [рдЕрдХреНрд╖])
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣рд╛рдВ рдПрдХ рдмрдЧ рднреА рд╣реИ (# 835) - рдКрдкрд░реА рдмрд╛рдЙрдВрдб рд╕рдорд╛рд╡реЗрд╢реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рд╕реНрд▓рд╛рдЗрд╕ рд╣реИрдВред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣рд╛рдВ рдПрдХ рдмрдЧ рднреА рд╣реИ - рдКрдкрд░реА рдмрд╛рдЙрдВрдб рд╕рдорд╛рд╡реЗрд╢реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рд╕реНрд▓рд╛рдЗрд╕ рд╣реИрдВред
рдирд┐рд╢реНрдЪрд┐рдд, рдзрдиреНрдпрд╡рд╛рджред
reduceat
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣реА рдирд╣реАрдВ, рдЖрдкрдиреЗ рдирд╣реАрдВ;)
рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ :\doc\neps\groupby_additions.rst
рдореЗрдВ reduceby
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ (IMO рдЕрд╡рд░) рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реЛрддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
reduceat
рд▓рд┐рдП рдореБрдЦреНрдп рдкреНрд░реЗрд░рдгрд╛ рдЕрдзрд┐рдХрддрдо рдЧрддрд┐ рдХреЗ рд▓рд┐рдПreduce
рд╕реЗ рдЕрдзрд┐рдХ рд▓реВрдк рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐reduce
рдкрд░ рд▓реВрдк рдХреЗ рд▓рд┐рдП рдПрдХ рд░реИрдкрд░ Numpy рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдпрд╣reduceat
рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд╡рд┐рд░реБрджреНрдз рдЬрд╛рдПрдЧрд╛редрдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ
reduceat
рдЕрд╕реНрддрд┐рддреНрд╡ рдФрд░ рдПрдкреАрдЖрдИ, рдкрд░ рдПрдХ рдкрд╛рд╢ рдХреЗ рд▓рд┐рдП рдПрдХ рддреЗрдЬреА рд╕реЗ vectorized рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХреЗ рд░реВрдк рдореЗрдВreduce
, рд╕реНрд╡рдЪреНрдЫ рдФрд░ рдЙрдкрдпреЛрдЧреА рд╣реИред рдореИрдВ рдЗрд╕реЗ рдЕрдкрджрд╕реНрде рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдмрд▓реНрдХрд┐ рдЗрд╕реЗ рдареАрдХ рдХрд░реВрдВрдЧрд╛редreduceat
рдЧрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рдорд╛рди, рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рд╣реИ, рдЬрд╣рд╛рдВ рдореИрдВreduceat
рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:рдпрд╣ 100x рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рд╕рдордп рдЕрдВрддрд░ рд╣реИ рдФрд░
reduceat
рджрдХреНрд╖рддрд╛ рдХреЗ рд╕рдВрд░рдХреНрд╖рдг рдХреЗ рдорд╣рддреНрд╡ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИредрд╕рд╛рд░рд╛рдВрд╢ рдореЗрдВ, рдореИрдВ рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдкрд░
reduceat
рдлрд┐рдХреНрд╕рд┐рдВрдЧ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреВрдВрдЧрд╛редрдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА
start_indices
рдФрд░end_indices
, рдЕрдХреНрд╕рд░ рдмреЗрдорд╛рдиреА рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЬреЛрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореМрдЬреВрджрд╛reduceat
рдЕрд╕рдВрдЧрдд рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рд╡реНрдпрд╡рд╣рд╛рд░ред