Python 使用numpy数组进行列表理解-不好的做法?

Python 使用numpy数组进行列表理解-不好的做法?,python,numpy,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)]) 此处的目标是获得与“a”形状相同的数组,其中“a”的第一个元素中的值乘以“b”的第一个元素,而“a”的第二个元素中的值乘以“b”的第二个元素 上面的代码是有效的,但考

我想知道下面的方法是否会被认为是不好的做法,如果是这样,是否有人可以对另一种方法提供一些指导

以下是相关代码:

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)])
此处的目标是获得与“a”形状相同的数组,其中“a”的第一个元素中的值乘以“b”的第一个元素,而“a”的第二个元素中的值乘以“b”的第二个元素

上面的代码是有效的,但考虑到所涉及的列表/数组的混合,我担心这是不可取的——但我不清楚是否有更优雅的解决方案。非常感谢

NumPythonic方法是将
b
的维度扩展到二维数组,然后让其发挥作用,进行
矢量化的元素乘法
。实现如下所示-

c = a * b[:,None]
一旦尺寸被扩展,您也可以使用
np.multiply
获得相同的效果,如下所示-

c = np.multiply(a,b[:,None])
最重要的是,这里有一些性能数据可以说服您使用
广播
-

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

那很有帮助,谢谢!我必须更好地理解“新轴”的概念。b[:无]。形状仍然表示1d数组,而不是2,因此我不一定认为这是有效的…
b[:无]
b[:,无]
有很大不同。逗号很重要。第一个是切片的一部分,
slice(None,None,None)
。第二个被
numpy
理解为具有这种特殊的
newaxis
含义。