Numpy: Reduceat Cornercase (Trac # 236)

рдХреЛ рдирд┐рд░реНрдорд┐рдд 19 рдЕрдХреНрддреВре░ 2012  ┬╖  49рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: numpy/numpy

2006-08-07 рдХреЛ рдЯреНрд░рд╛рдЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдорд╛рд░реНрдЯрд┐рди_рд╡реАрдЪрд░реНрдЯ рджреНрд╡рд╛рд░рд╛ _рдСрд░рд┐рдЬрд┐рдирд▓ рдЯрд┐рдХрдЯ http://projects.scipy.org/numpy/ticket/236 , рдЕрдЬреНрдЮрд╛рдд рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ ред_

.reduceat рджреЛрд╣рд░рд╛рдпрд╛ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд╣реАрдВ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред рдЬрдм рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдСрдкрд░реЗрд╢рди рдХрд╛ рддрдЯрд╕реНрде рддрддреНрд╡ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдиреАрдЪреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ [0, 10], рдирд╣реАрдВ [1, 10], рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИред

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])
01 - Enhancement 23 - Wish List numpy.core

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

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 рдЕрд╕рдВрдЧрдд рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рд╡реНрдпрд╡рд╣рд╛рд░ред

рд╕рднреА 49 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

_ @ рдЯреЛрд▓рд┐рдкрд┐рдВрде рдиреЗ 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 рдпрджрд┐ рдХреЛрдИ рднреА рдЧрд┐рди рд░рд╣рд╛ рд╣реИ) рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ:

  • рдореМрдЬреВрджрд╛ рдХреЛ рдЙрдмрд╛рд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдирдпрд╛ рдХрд╛рд░реНрдп рдмрдирд╛рдирд╛
    рдПрдХред
  • рдЖрд░рдВрдн рдФрд░ рд╕рдорд╛рдкреНрддрд┐ рд╕реВрдЪрдХ рддрд░реНрдХреЛрдВ рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп
    рдЬрд╛рджреБрдИ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдмрд╣реБрдЖрдпрд╛рдореА рд╕рд░рдгреА рд╕реЗ рдмрд╛рд╣рд░ рд▓рдЧрд╛рдирд╛ред
  • рдХреЛрдИ рдирд╣реАрдВ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЪреВрдХ рдмрд╣реБрдд рд╕рд╛рдл рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдирдП рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬреЗрдВ рд╣реИрдВ:

  • рдХреНрдпрд╛ рд╣рдореЗрдВ 'рд╕реНрдЯреЗрдк тАЩрдХреЛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? (рдореИрдВ рд╣рд╛рдБ рдХрд╣реВрдБрдЧрд╛)
  • рдХреНрдпрд╛ рдпрд╣ рдЗрдВрдбреЗрдХреНрд╕ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдпрд╛ рдЙрдиреНрд╣реЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
    1D рд╣реЛ?
  • рдпрд╣ рдПрдХ np рдлрд╝рдВрдХреНрд╢рди, рдпрд╛ рдПрдХ ufunc рд╡рд┐рдзрд┐ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ
    рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ)

рдФрд░ рдмрд╛рдЗрдХ рд╢реЗрдбрд┐рдВрдЧ рд╡рд┐рднрд╛рдЧ рд╕реЗ, рдореБрдЭреЗ рдмреЗрд╣рддрд░ рдкрд╕рдВрдж рд╣реИ:

  • рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдпрд╛рджрдЧрд╛рд░ рдирд╛рдо рджреЗрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рд╣реИред
  • рдпрджрд┐ рд╣рдо 'рд╕реНрдЯрд╛рд░реНрдЯ' рдФрд░ 'рд╕реНрдЯреЙрдк' (рдФрд░ 'рд╕реНрдЯреЗрдк' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)
    np.arange рдФрд░ рдкрд╛рдпрдерди рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ред
  • рдХреНрд╡рд╛рд░реНрдЧ рдирд╛рдореЛрдВ рд╕реЗ _indices рдХреЛ рдЫреЛрдбрд╝рдирд╛ред

рдЬреИрдореЗ

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)) , reduceat ufunc.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 рдЕрд╡рд░) рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реЛрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

keithbriggs picture keithbriggs  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Foadsf picture Foadsf  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

marcocaccin picture marcocaccin  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

amuresan picture amuresan  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ghost picture ghost  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ