如何有效地乘以 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
给定一个形状 (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