在python中优化2D-1D操作

时间:2019-06-07 14:24:22

标签: python numpy

应用诸如乘法之类的简单操作的pythonic-CPU优化方法是什么:

  • 沿着二维数组的一维
  • 到2D数组另一个维度的所有元素
  • 根据另一个一维数组中的元素

示例:

x=np.arange(150).reshape([50,3])
y=np.arange(50)+10

我想做:

np.array([x[i,:]*y[i] for i in range(50)])

但是我想使其尽可能快,因为'50'可能是数十亿。

顺便说一句,这完全等同于:

np.array([x[i,:]*j for i,j in enumerate(y)])


我在这里做了一些更新,但终于提出了一个新问题

2 个答案:

答案 0 :(得分:4)

您可以仅使用yNonenp.newaxis添加新轴,以便可以在x上广播它:

x * y[:,None]

np.allclose((x * y[:,None]), np.array([x[i,:]*y[i] for i in range(50)]))
# True

答案 1 :(得分:1)

另一种可能性,使用瑞士军刀的阵列产品,即 np.einsum

In [9]: x=np.arange(150).reshape([50,3])
   ...: y=np.arange(50)+10
   ...: check=np.array([x[i,:]*y[i] for i in range(50)])
   ...: np.allclose(np.einsum('ji,j->ji', x, y),check)
Out[9]: True