我有一个2-d numpy数组(MxN)和另外两个1-d数组(Mx1),它们代表了我想要总结的2-d数组的每一行的起始和结束索引。我正在寻找在大型阵列中执行此操作的最有效方法(最好不必使用循环,这是我目前正在做的事情)。我想做的一个例子如下。
>>> random.seed(1234)
>>> a = random.rand(4,4)
>>> print a
[[ 0.19151945 0.62210877 0.43772774 0.78535858]
[ 0.77997581 0.27259261 0.27646426 0.80187218]
[ 0.95813935 0.87593263 0.35781727 0.50099513]
[ 0.68346294 0.71270203 0.37025075 0.56119619]]
>>> b = array([1,0,2,1])
>>> c = array([3,2,4,4])
>>> d = empty(4)
>>> for i in xrange(4):
d[i] = sum(a[i, b[i]:c[i]])
>>> print d
[ 1.05983651 1.05256841 0.8588124 1.64414897]
我的问题类似于以下问题,但是,我不认为那里提出的解决方案会非常有效。 Numpy sum of values in subarrays between pairs of indices在该问题中,他们希望找到同一行的多个子集的总和,因此可以使用cumsum()
。但是,我只会在每行中找到一个总和,所以我认为这不是计算总和的最有效方法。
编辑:对不起,我在代码中犯了一个错误。循环内的行先前读为d[i] = sum(a[b[i]:c[i]])
。我忘记了第一个维度的索引。每组起始和结束索引对应于2-d数组中的新行。
答案 0 :(得分:1)
你可以这样做:
from numpy import array, random, zeros
random.seed(1234)
a = random.rand(4,4)
b = array([1,0,2,1])
c = array([3,2,4,4])
lookup = zeros(len(a) + 1, a.dtype)
lookup[1:] = a.sum(1).cumsum()
d = lookup[c] - lookup[b]
print d
如果你的b / c数组很大并且你总结的窗口很大,这可能会有所帮助。因为您的窗口可能重叠,例如2:4和1:4大致相同,所以您基本上是在重复操作。通过将cumsum作为每个处理步骤,您可以减少重复操作的次数,并且可以节省时间。如果你的窗户很小而且b / c很小,这对你来说无济于事,主要是因为你要总结你不太关心的矩阵的一部分。希望有所帮助。