【问题标题】:Numpy sum over repeated entries in index array索引数组中重复条目的 Numpy 总和
【发布时间】:2020-03-02 01:11:04
【问题描述】:

给定 numpy ndarray A 和一个整数数组 I,形状相同,具有最高值 imax 和一个数组 B = np.zeros(imax),我们可以做 B[I] = A。但是,如果I 有重复的条目,则最后一个分配成立。我需要在汇总重复条目时这样做,例如

For i in range(A.size):
    B[I.ravel()[i]] += A.ravel()[i]

numpy 有没有好的方法来做到这一点?

例如,我想要这种行为(但 =+= 都不是这样工作的)

A = np.array((1,2,5,9))
I = np.array((0,1,2,0),dtype=int)
B = np.zeros(3)
B[I] += A
print(B)
>>> array([10,2,5])

我们在第一个条目中看到1+9=10

【问题讨论】:

  • 如果您提供了一个说明问题的数据示例,您的问题会变得更清晰(并且更容易正确回答)。
  • add.at 提供了一个无缓冲的添加,供您在索引重复时使用
  • @Grismar 我添加了一个例子!
  • @hpaulj 这就是答案,非常感谢!如果你想让它成为一个答案,我会接受它。

标签: python arrays numpy indexing sum


【解决方案1】:
In [1]: A = np.array((1,2,5,9)) 
   ...: I = np.array((0,1,2,0),dtype=int) 
   ...: B = np.zeros(3) 
   ...: B[I] += A                                                                                                          
In [2]: B                                                                                                                  
Out[2]: array([9., 2., 5.])

这是一种缓冲解决方案,不同于迭代解决方案:

In [3]: B = np.zeros(3)                                                                                                    
In [4]: for i,a in zip(I,A): 
   ...:     B[i] += a 
   ...:                                                                                                                    
In [5]: B                                                                                                                  
Out[5]: array([10.,  2.,  5.])

使用ufunc.at的无缓冲解决方案:

In [6]: B = np.zeros(3)                                                                                                    
In [7]: np.add.at(B, I, A)                                                                                                 
In [8]: B                                                                                                                  
Out[8]: array([10.,  2.,  5.])

【讨论】:

    猜你喜欢
    • 2018-10-25
    • 1970-01-01
    • 2013-08-07
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多