NumPy总和不相交的指数

时间:2015-09-26 14:59:50

标签: python arrays numpy sum

我有一个应用程序,我需要在3D NumPy数组中对任意索引组求和。内置的NumPy数组求和例程总结了ndarray的一个维度上的所有索引。相反,我需要在数组中的一个维度上总结索引范围并返回一个新数组。

例如,我们假设我有一个形状为(70,25,3)的ndarray。我希望总结某些索引范围的第一个维度并返回一个新的3D数组。考虑来自0:25, 25:5050:75的总和,它将返回一个形状(3,25,3)的数组。

是否有一种简单的方法可以在NumPy数组的一个维度上做“不相交的总和”来产生这个结果?

3 个答案:

答案 0 :(得分:8)

您可以使用np.add.reduceat作为此问题的一般方法。即使范围的长度不同,这也有效。

要沿着0轴对切片0:2525:5050:75求和,请传入索引[0, 25, 50]

np.add.reduceat(a, [0, 25, 50], axis=0)

此方法也可用于求和非连续范围。例如,要对切片0:2537:4751:75求和,请写:

np.add.reduceat(a, [0,25, 37,47, 51], axis=0)[::2]

相同长度范围求和的另一种方法是重新整形数组,然后沿轴求和。与上面第一个例子相同的是:

a.reshape(3, a.shape[0]//3, a.shape[1], a.shape[2]).sum(axis=1)

答案 1 :(得分:2)

只需对每个部分求和,然后使用结果创建一个新数组。

import numpy as np
i1, i2 = (2,7)

a = np.ones((10,5,3))
b = np.sum(a[0:i1,...], 0)
c = np.sum(a[i1:i2,...], 0)
d = np.sum(a[i2:,...], 0)

g = np.array([b,c,d])

>>> g.shape
(3, 5, 3)
>>> g
array([[[ 2.,  2.,  2.],
        [ 2.,  2.,  2.],
        [ 2.,  2.,  2.],
        [ 2.,  2.,  2.],
        [ 2.,  2.,  2.]],

       [[ 5.,  5.,  5.],
        [ 5.,  5.,  5.],
        [ 5.,  5.,  5.],
        [ 5.,  5.,  5.],
        [ 5.,  5.,  5.]],

       [[ 3.,  3.,  3.],
        [ 3.,  3.,  3.],
        [ 3.,  3.,  3.],
        [ 3.,  3.,  3.],
        [ 3.,  3.,  3.]]])
>>>

答案 2 :(得分:1)

您可以使用var url = 'http://example.com/feed.xml'; var randomParameter = '0.1234'; var queryString = url.indexOf('?') > - 1; if(queryString){ url = url + '&' + randomParameter; } else { url = url + '?' + randomParameter; } //url needs to be escaped with encodeURIComponent; 拆分数组,然后使用np.split将项目沿第二轴求和:

np.sum

演示:

np.sum(np.split(my_array,3),axis=1)

另请注意,如果您有不同的切片长度,则可以将切片的末尾传递给>>> a=np.arange(270).reshape(30,3,3) >>> np.sum(np.split(a,3),axis=1) array([[[ 405, 415, 425], [ 435, 445, 455], [ 465, 475, 485]], [[1305, 1315, 1325], [1335, 1345, 1355], [1365, 1375, 1385]], [[2205, 2215, 2225], [2235, 2245, 2255], [2265, 2275, 2285]]]) 函数:

np.split