gpt4 book ai didi

python - 二维数组中索引对之间的 Numpy 总和

转载 作者:太空宇宙 更新时间:2023-11-03 19:09:33 25 4
gpt4 key购买 nike

我有一个二维 numpy 数组 (MxN) 和另外两个一维数组 (Mx1),它们代表我想要求和的二维数组每一行的开始和结束索引。我正在寻找在大型数组中执行此操作的最有效方法(最好不必使用循环,这就是我当前正在做的事情)。我想做的一个例子如下。

>>> 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]])。我忘记了第一个维度的索引。每组起始索引和结束索引对应于二维数组中的一个新行。

最佳答案

你可以这样做:

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 大部分相同,所以您实际上是在重复操作。通过将累积和作为每个处理步骤,您可以减少重复操作的数量,并且可以节省时间。如果您的窗口很小且 b/c 也很小,这不会有太大帮助,主要是因为您将对 a 矩阵中您不太关心的部分进行求和。希望有帮助。

关于python - 二维数组中索引对之间的 Numpy 总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13476450/

25 4 0
文章推荐: python - Django 管理员 : Add