I have an application where I need to sum across arbitrary groups of indices in a 3D NumPy array. The built-in NumPy array sum routine sums up all indices along one of the dimensions of an ndarray. Instead, I need to sum up ranges of indices along one of the dimensions in my array and return a new array.
For example, let's assume that I have an ndarray with shape (70,25,3)
. I wish to sum up the first dimension along certain index ranges and return a new 3D array. Consider the sum from 0:25, 25:50
and 50:75
which would return an array of shape (3,25,3)
.
Is there an easy way to do "disjoint sums" along one dimension of a NumPy array to produce this result?
You can use
np.add.reduceat
as a general approach to this problem. This works even if the ranges are not all the same length.To sum the slices
0:25
,25:50
and50:75
along axis 0, pass in indices[0, 25, 50]
:This method can also be used to sum non-contiguous ranges. For instance, to sum the slices
0:25
,37:47
and51:75
, write:An alternative approach to summing ranges of the same length is to reshape the array and then sum along an axis. The equivalent to the first example above would be:
You can use
np.split
to split your array then usenp.sum
to sum your items along the second axis :Demo:
Also note that if you have a different slice lengths you can pass the end of you slices to
np.split
function :Just sum each portion and use the results to create a new array.