我有一个应用程序,我需要在3D NumPy数组中对任意索引组求和。内置的NumPy数组求和例程总结了ndarray的一个维度上的所有索引。相反,我需要在数组中的一个维度上总结索引范围并返回一个新数组。
例如,我们假设我有一个形状为(70,25,3)
的ndarray。我希望总结某些索引范围的第一个维度并返回一个新的3D数组。考虑来自0:25, 25:50
和50:75
的总和,它将返回一个形状(3,25,3)
的数组。
是否有一种简单的方法可以在NumPy数组的一个维度上做“不相交的总和”来产生这个结果?
答案 0 :(得分:8)
您可以使用np.add.reduceat
作为此问题的一般方法。即使范围的长度不同,这也有效。
要沿着0轴对切片0:25
,25:50
和50:75
求和,请传入索引[0, 25, 50]
:
np.add.reduceat(a, [0, 25, 50], axis=0)
此方法也可用于求和非连续范围。例如,要对切片0:25
,37:47
和51: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