2016-08-18 23 views
0

numpyの乗算異なる形状

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

x*y、私はこのようにする必要があり、製品cに一緒にこれを乗算する必要があり、この

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

ように二つの配列を有していて、次のエラーを与えます、

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

あなたはxy間のペアごとの要素単位乗算にNumPy broadcastingを使用し、そのように、.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