如何有效地乘以 numpy 数组中的相应元素?

How do I multiply corresponding elements in numpy arrays efficiently?

给定一个形状 (m,) 的 numpy 数组 x 和一个形状 (m/n,) 的 numpy 数组 y,我如何将 x 乘以相应的元素y 有效?

这是我的最佳尝试:

In [13]: x = np.array([1, 5, 3, 2, 9, 1])

In [14]: y = np.array([2, 4, 6])

In [15]: n = 2

In [16]: (y[:, np.newaxis] * x.reshape((-1, n))).flatten()
Out[16]: array([ 2, 10, 12,  8, 54,  6])

我觉得你的解决方案很不错。

如果你想稍微加快速度,你可以:

  • 使用 ravel() 而不是 flatten()(如果可能,前者将 return 一个视图,后者总是 return 一个副本)。

  • 在 Fortran 中重塑 x 以避免在 y 上进行另一个索引操作的开销(尽管随后的计时表明这种加速可以忽略不计)

所以重写乘法变成:

>>> (x.reshape((2, -1), order='f') * y).ravel('f')
array([ 2, 10, 12,  8, 54,  6])

时间:

>>> %timeit (y[:, np.newaxis] * x.reshape((-1, n))).flatten()
100000 loops, best of 3: 7.4 µs per loop

>>> %timeit (x.reshape((n, -1), order='f') * y).ravel('f')
100000 loops, best of 3: 4.98 µs per loop