假设我a
a.shape
(m*n,)
m
,我如何创建一个新数组,其中包含每组n
元素的a.reshape((m, n)).sum(axis=1)
总和有效地
我想出的最好的是:
{{1}}
但这会创建一个额外的新阵列。
答案 0 :(得分:6)
我认为使用reshape
然后获取行的总和没有任何问题,我想不出更快的事情。根据{{3}},reshape
应该(如果可能)返回原始数组的视图,因此不会复制大量数据。创建视图时,numpy只会创建一个具有不同步幅和形状的新标题,并带有指向原始数组数据的指针。这应该花费恒定的时间和内存,与数组大小无关。
In [23]: x = np.arange(12)
In [24]: y = x.reshape((3, 4))
In [25]: y
Out[25]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [26]: y.base is x # check if it is a view
Out[26]: True
答案 1 :(得分:3)
还有另一个技巧,cumsum
,reduceat
上的变体。在这种情况下
np.add.reduceat(a, np.arange(0,m*n,n))
对于m,n=100,10
,它的速度是x.reshape((m,n)).sum(axis=1)
的2倍。
我没有太多使用它,所以在文档中花了一些时间进行挖掘。