2016-08-18 65 views
0

具有两个阵列是这样numpy的乘以不同的形状

x = [a,b] 
y = [p,q,r] 

我需要一起相乘这对一个产品c这应该是这样的,

c = [a*p, a*q, a*r, b*p, b*q, b*r] 

然而x*y提供了以下错误,

ValueError: operands could not be broadcast together with shapes (2,) (3,) 

我可以这样做,

for i in range(len(x)): 
    for t in range(len(y)): 
     c.append(x[i] * y[t] 

但真正的长度我xy是相当大的有啥做出这样的乘法没有循环的最有效方式。

+0

“a”,“b”,“p”,“q”等是标量还是其他? – Divakar

+0

@Divakar他们是浮动的,所以我想他们是标量不是吗? – rksh

+0

看来你已经错过了'a * r' – Kasramvd

回答

4

可以使用NumPy broadcastingxy之间的成对的elementwise乘法,然后用.ravel()压平,像这样 -

(x[:,None]*y).ravel() 

或者使用outer product然后压平 -

np.outer(x,y).ravel() 
+0

谢谢,我该如何让输出像这样'c = [[a * p,a * q,a * r],[ b * p,b * q,b * r]]' – rksh

+0

@rksh在没有拼合的情况下使用,即不使用'.ravel()'? – Divakar

+0

是没有扁平化:) – rksh

0

使用NumPy的点。 ..

>>> import numpy as np 
>>> a=np.arange(1,3)# [1,2] 
>>> b=np.arange(1,4)# [1,2,3] 
>>> np.dot(a[:,None],b[None]) 
array([[1, 2, 3], 
     [2, 4, 6]]) 
>>> np.dot(a[:,None],b[None]).ravel() 
array([1, 2, 3, 2, 4, 6]) 
>>> 
+0

感谢没有展平的相同功能? – rksh