我想乘以一個形狀(10,)的陣列和形狀(10,20)的矩陣,基本上乘以每個列的數組。乘以元素陣列和矩形矩陣
但我得到
ValueError: operands could not be broadcast together with shapes (20,) (20,10)
當我使用(10,10)矩陣和(10)陣列它的工作。
我不想用for
循環來做到這一點,以優化我的算法所花費的時間。 (該陣列/矩陣opreation遠遠深於其他許多環路)
我想乘以一個形狀(10,)的陣列和形狀(10,20)的矩陣,基本上乘以每個列的數組。乘以元素陣列和矩形矩陣
但我得到
ValueError: operands could not be broadcast together with shapes (20,) (20,10)
當我使用(10,10)矩陣和(10)陣列它的工作。
我不想用for
循環來做到這一點,以優化我的算法所花費的時間。 (該陣列/矩陣opreation遠遠深於其他許多環路)
廣播的第一條規則是具有最小尺寸的陣列得到擴展 - 並且擴展發生在陣列的前端。 (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]])
不同的結果。
謝謝,效果很好!非常清楚的解釋| – Doob
做'arr1 [:,無] * arr2'。 – Divakar
要使廣播能夠正常工作,必須使用形狀(10)到(10,1)來重新整形陣列。 Divakar的建議將起作用。 –