我想知道下面的方法是否会被认为是不好的做法,如果是的话,如果有人可以给出另一种方法的指导.
这是有问题的代码:
a = np.array([[1,2,3],[4,5,6]])
b = np.array([-5,5])
c = np.array([np.multiply(a[x],b[x]) for x in range(2)])
Run Code Online (Sandbox Code Playgroud)
这里的目标是获得一个与'a'形状相同的数组,其中'a'的第一个元素中的值乘以'b'的第一个元素,并且'a'的第二个元素中的值相乘由'b'的第二个元素
上面的代码是有效的,但考虑到列表/数组的混合,我担心这是建议不要 - 但我不清楚更优雅的解决方案.提前谢谢了!
NumPythonic的方法是将尺寸扩展b到2D阵列,np.newaxis/None 然后让它broadcasting发挥作用vectorized elementwise multiplication.实现看起来像这样 -
c = a * b[:,None]
Run Code Online (Sandbox Code Playgroud)
一旦尺寸扩展,您也可以使用np.multiply相同的效果,如此 -
c = np.multiply(a,b[:,None])
Run Code Online (Sandbox Code Playgroud)
最重要的是,这里有一些性能数据可以说服你使用broadcasting-
In [176]: a = np.random.rand(2000,3000)
In [177]: b = np.random.rand(2000)
In [178]: %timeit np.array([np.multiply(a[x],b[x]) for x in range(a.shape[0])])
10 loops, best of 3: 118 ms per loop
In [179]: %timeit a * b[:,None]
10 loops, best of 3: 63.8 ms per loop
In [180]: %timeit np.multiply(a,b[:,None])
10 loops, best of 3: 64 ms per loop
Run Code Online (Sandbox Code Playgroud)