python - numpy:有效地与索引数组求和

标签 python numpy

假设我有 2 个矩阵 M 和 N(都有 > 1 列)。我还有一个包含 2 列的索引矩阵 I——1 列用于 M,1 列用于 N。N 的索引是唯一的,但 M 的索引可能出现不止一次。我想执行的操作是,

for i,j in w:
  M[i] += N[j]

除了 for 循环之外,还有更有效的方法吗?

最佳答案

为了完整起见,在 numpy >= 1.8 中,您还可以使用 np.addat 方法:

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

除了明显的性能劣势外,它还有几个优点:

  1. np.bincount 将其权重转换为 double float ,.at 将使用数组的 native 类型进行操作。这使它成为最简单的交易选项,例如复数。
  2. np.bincount 只将权重加在一起,你有一个用于所有 ufunc 的 at 方法,所以你可以重复 multiply,或者 logical_and,或者任何你喜欢的。

但对于您的用例,np.bincount 可能是可行的方法。

关于python - numpy:有效地与索引数组求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23905817/

相关文章:

python - 有关解析价格和美元符号的问题

python - 列表索引必须是整数而不是 str python sqlite3

python - numpy 和操作 a ,b = b, a

numpy - Numpy 文档中提到的 "sum product"是什么意思?

python - 距行中第一个非空元素的距离的 numpy 矩阵

python - 运行时错误 : The current Numpy installation fails to pass a sanity check due to a bug in the windows runtime

python - anaconda中安装了多个mkl包

python - 两本词典的交集和差集

python - python中for循环的聚合结果

python - 将图像添加到 pandas 数据框行