我想知道以下方法是否会被视为不好的做法,如果是的话,是否有人可以为另一种方法提供一些指导。
这是有问题的代码:
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
到一个二维数组np.newaxis/None http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#numpy.newaxis然后让broadcasting http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html发挥作用vectorized elementwise multiplication
。实施看起来像这样 -
c = a * b[:,None]
一旦尺寸扩展,您还可以使用np.multiply
为了达到同样的效果,就像这样 -
c = np.multiply(a,b[:,None])
最重要的是,这里有一些性能数据可以说服您使用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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)