我有一个形状(N,2)的numpy数组A和形状(N)的numpy数组S.
如何将两个数组相乘?目前我正在使用此代码:
tupleS = numpy.zeros( (N , 2) )
tupleS[:,0] = S
tupleS[:,1] = S
product = A * tupleS
我是一名蟒蛇初学者。有更好的方法吗?
答案 0 :(得分:6)
Numpy使用行主要顺序,因此您必须显式创建一个列。如:
>> A = numpy.array(range(10)).reshape(5, 2)
>>> B = numpy.array(range(5))
>>> B
array([0, 1, 2, 3, 4])
>>> A * B
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: shape mismatch: objects cannot be broadcast to a single shape
>>> B = B.reshape(5, 1)
>>> B
array([[0],
[1],
[2],
[3],
[4]])
>>> A * B
array([[ 0, 0],
[ 2, 3],
[ 8, 10],
[18, 21],
[32, 36]])
答案 1 :(得分:3)
与@ senderle的答案基本相同,但不需要S的就地操作。您可以通过添加索引为None
的轴来获取切片数组,这将使它们相乘: A * S[:,None]
。
>>> S = np.arange(5)
>>> S
array([0, 1, 2, 3, 4])
>>> A = np.arange(10).reshape((5,2))
>>> A
array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
>>> S[:,None]
array([[0],
[1],
[2],
[3],
[4]])
>>> A * S[:,None]
array([[ 0, 0],
[ 2, 3],
[ 8, 10],
[18, 21],
[32, 36]])
答案 2 :(得分:1)
你试过这个:
product = A * S
答案 3 :(得分:1)
Al强硬你的问题的标题有点用词不当,我认为你遇到的问题主要与numpy
broadcasting rules有关。因此,以下方法不起作用(正如您已经观察到的那样):
In []: N= 5
In []: A= rand(N, 2)
In []: A.shape
Out[]: (5, 2)
In []: S= rand(N)
In []: S.shape
Out[]: (5,)
In []: A* S
------------------------------------------------------------
Traceback (most recent call last):
File "<ipython console>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (5,2) (5)
但是,现在让S
与广播规则(A* S
的元素明智产品)兼容的简单方法是扩展其维度,例如:
In []: A* S[:, None]
Out[]:
array([[ 0.54216549, 0.04964989],
[ 0.41850647, 0.4197221 ],
[ 0.03790031, 0.76744563],
[ 0.29381325, 0.53480765],
[ 0.0646535 , 0.07367852]])
但这只是expand_dims的语法糖,就像:
In []: expand_dims(S, 1).shape
Out[]: (5, 1)
无论如何,我个人更喜欢这种简单无忧的方法:
In []: S= rand(N, 1)
In []: S.shape
Out[]: (5, 1)
In []: A* S
Out[]:
array([[ 0.40421854, 0.03701712],
[ 0.63891595, 0.64077179],
[ 0.03117081, 0.63117954],
[ 0.24695035, 0.44950641],
[ 0.14191946, 0.16173008]])
因此python
;显而易见而不是暗示。
答案 4 :(得分:-1)
我能想到:
product = A * numpy.tile(S, (2,1)).T
更快的解决方案可能是:
product = [d * S for d in A.T]
虽然这不会让你得到一个numpy数组作为输出,并且它被转置。所以要得到一个类似的numpy数组(注意这比第一个解决方案慢):
product = numpy.array([d * S for d in A.T]).T
可能还有十几种其他有效的解决方案,包括比这些更好的解决方案......