假设我有2个矩阵M和N(都具有> 1列)。我也有一个包含2列的索引矩阵I- M代表1列,N代表1列。N的索引是唯一的,但是M的索引可能会出现多次。我要执行的操作是
for i,j in w: M[i] += N[j]
除了for循环以外,还有其他更有效的方法吗?
为了完整起见,在numpy> = 1.8中,您还可以使用np.add的at方法:
np.add
at
In [8]: m, n = np.random.rand(2, 10) In [9]: m_idx, n_idx = np.random.randint(10, size=(2, 20)) In [10]: m0 = m.copy() In [11]: np.add.at(m, m_idx, n[n_idx]) In [13]: m0 += np.bincount(m_idx, weights=n[n_idx], minlength=len(m)) In [14]: np.allclose(m, m0) Out[14]: True In [15]: %timeit np.add.at(m, m_idx, n[n_idx]) 100000 loops, best of 3: 9.49 us per loop In [16]: %timeit np.bincount(m_idx, weights=n[n_idx], minlength=len(m)) 1000000 loops, best of 3: 1.54 us per loop
除了明显的性能劣势外,它还有两个优点:
np.bincount
.at
multiply
logical_and
但是对于您的用例,np.bincount可能是要走的路。