2016-08-12 119 views
0

我想乘以一個形狀(10,)的陣列和形狀(10,20)的矩陣,基本上乘以每個列的數組。乘以元素陣列和矩形矩陣

但我得到

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

當我使用(10,10)矩陣和(10)陣列它的工作。

我不想用for循環來做到這一點,以優化我的算法所花費的時間。 (該陣列/矩陣opreation遠遠深於其他許多環路)

+1

做'arr1 [:,無] * arr2'。 – Divakar

+0

要使廣播能夠正常工作,必須使用形狀(10)到(10,1)來重新整形陣列。 Divakar的建議將起作用。 –

回答

2

廣播的第一條規則是具有最小尺寸的陣列得到擴展 - 並且擴展發生在陣列的前端。 (10,)*(10,20)的情況下,有2個dim,所以第一個展開爲(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

如果你想乘2矩陣,他們必須有數學和程序

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

的訂單,你會得到C = A x B將被塑造C => a x b

所以你的第一個陣列必須是(1,10)乘以一個矩陣(10,20),你會得到一個數組(1,20)

要做到這一點,你可以transpose你的第一個陣列

+1

您正在描述矩陣乘法,而不是元素乘法。 – hpaulj