2016-08-12 8 views
0

基本的に、形状の配列(10)と形状の行列(10,20)を要素ごとに掛けたければ、基本的に各列に配列を掛けます。要素ごとの配列と長方形の行列を掛け合わせる

しかし、私は(10,10)行列と(10)のアレイを使用する場合には動作しない

ValueError: operands could not be broadcast together with shapes (20,) (20,10)

を得ました。

forループでアルゴリズムを実行しないようにしたいと思っています。あなたは2行列を乗算したい場合、彼らは数学でとプログラム

A => a x n 
B => n x b 

で順序を持っている必要があり、あなたが形になりますC = A x Bを取得

+1

'arr1 [:、なし] * arr2'を実行します。 – Divakar

+0

ブロードキャストを有効にするには、shape(10、)〜(10、1)の配列を再形成する必要があります。ディバカールの提案がうまくいく。 –

答えて

2

ブロードキャストの最初のルールは、最小次元の配列が展開され、展開が配列の前面で行われることです。

(10、)*(10,20)の場合、2つの淡色があるため、最初は(1,10)に展開されます。しかし、それは一致するように変更することはできません(10,20)。

したがって、明示的に(10、)を(10,1)に変更する必要があります。 Noneで最も簡単な方法です。

x[:,None]*y 

注意:MATLABでは、もう一方の端で拡張が行われます。しかし、MATLABがまだ放送しているかどうかはわかりません。 Octaveはそれを数年前に追加しました。

================

(10)*(10,10)場合には、=>(1,10)*(10,10 )=>(10,10)

In [1403]: np.arange(4)*np.ones((4,4),int) 
Out[1403]: 
array([[0, 1, 2, 3], 
     [0, 1, 2, 3], 
     [0, 1, 2, 3], 
     [0, 1, 2, 3]]) 

In [1404]: np.arange(4)[:,None]*np.ones((4,4),int) 
Out[1404]: 
array([[0, 0, 0, 0], 
     [1, 1, 1, 1], 
     [2, 2, 2, 2], 
     [3, 3, 3, 3]]) 

異なる結果。

+0

ありがとう、うまくいった!非常に明確な説明| – Doob

0

(この配列/行列opreationは、他の多くのループでこれまでの深さです) C => a x b

ので、あなたの最初の配列が行列(10,20)を乗算する(1,10)である必要があり、あなたがあなたの最初の配列をtransposeできることを行うために、アレイ(1,20)

を取得します

+1

要素の賢明な乗算ではなく、行列の乗算について説明しています。 – hpaulj

関連する問題