2016-08-18 117 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