Python 如何用标量数组乘以numpy元组数组

Python 如何用标量数组乘以numpy元组数组,python,arrays,numpy,tuples,Python,Arrays,Numpy,Tuples,我有一个形状为(N,2)的numpy数组和一个形状为(N)的numpy数组 如何将两个数组相乘?目前我正在使用此代码: tupleS = numpy.zeros( (N , 2) ) tupleS[:,0] = S tupleS[:,1] = S product = A * tupleS 我是python初学者。有更好的方法吗?您是否尝试过以下方法: product = A * S 我能想到: product = A * numpy.tile(S, (2,1)).T 更快的解决方案可能是:

我有一个形状为(N,2)的numpy数组和一个形状为(N)的numpy数组

如何将两个数组相乘?目前我正在使用此代码:

tupleS = numpy.zeros( (N , 2) )
tupleS[:,0] = S
tupleS[:,1] = S
product = A * tupleS
我是python初学者。有更好的方法吗?

您是否尝试过以下方法:

product = A * S
我能想到:

product = A * numpy.tile(S, (2,1)).T
更快的解决方案可能是:

product = [d * S for d in A.T]
虽然这并不能得到一个numpy数组作为输出,而且它是转置的。因此,要获得类似的numpy阵列(请注意,这比第一个解决方案要慢):


可能还有十几种其他有效的解决方案,包括比这些更好的解决方案……

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]])
>A=numpy.array(范围(10))。重塑(5,2)
>>>B=numpy.数组(范围(5))
>>>B
数组([0,1,2,3,4])
>>>A*B
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ValueError:形状不匹配:无法将对象广播到单个形状
>>>B=B.重塑(5,1)
>>>B
数组([[0],
[1],
[2],
[3],
[4]])
>>>A*B
数组([[0,0],
[ 2,  3],
[ 8, 10],
[18, 21],
[32, 36]])

基本上与@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]])

虽然你问题的标题有点用词不当,但我认为你遇到的问题主要与
numpy
有关。因此,以下操作将不起作用(正如您已经观察到的):

但这实际上只是句法上的糖分,比如:

无论如何,我个人更喜欢这种简单的无障碍方法:

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
;显式比隐式更简单。

+1,使用numpy的广播功能始终是一条可行之路。@Stiefel,@MRAB,我认为问题在于,您必须重新塑造
s
的形状。对,A*s由于形状不匹配而无法工作。重塑确实是解决方案。值得注意的是,
重塑
创建的是视图,而不是副本:
>>s=numpy.arange(5);s、 重塑(5,1)[3,0]=99;repr(s)
->
'array([0,1,2,99,4])”
。所以你可以只做
A*B.重塑(5,1)
而不改变
B
。谢谢,我改变了标题。回答得好。我接受了senderles的回答,因为这是最简单的。所有答案都旨在将形状修改为(N,1)。
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) 
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]])
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]])