列表理解与numpy数组 - 糟糕的做法?

las*_*lex 6 python numpy

我想知道下面的方法是否会被认为是不好的做法,如果是的话,如果有人可以给出另一种方法的指导.

这是有问题的代码:

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'的第二个元素

上面的代码是有效的,但考虑到列表/数组的混合,我担心这是建议不要 - 但我不清楚更优雅的解决方案.提前谢谢了!

Div*_*kar 9

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)

  • `b [:None]`与`b [:,None]`非常不同.逗号很重要.第一个是切片的一部分,`slice(None,None,None)`.第二个被'numpy`理解为具有这个特殊的`newaxis`含义. (3认同)