2016-11-29 143 views
2

我最近碰到與numpy廣播下列問題。numpy廣播(N,)和與(N,1)數組

y = randn(100) 
x = randn(100,1) 
(y+x).shape 
> 100,100 

雖然我知道這是根據https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html規則,這似乎是直覺上什麼人會想到 - 這個結果是(100,1)載體。

我只是想知道 - 這種行爲是否有一個很好的理由(即這是行爲的理想) - 或者它只是廣播規則定義方式的產物。

+0

'y + x.T'可能會給你你想要的。 –

回答

2

其基本思想是,當一個或另一個數組需要對結果形狀進行迭代時纔有意義,然後對主軸的每個條目迭代執行操作(另外,NumPy提供了引起迭代的方法如果需要,可以在不同軸上使用,例如einsum)。

在這種情況下,x沿着其主軸有100個不同的東西,每個都被單獨添加到y。我們只取第一個值x[0]並將其添加到y。現在我們正在談論y有100件東西迭代地添加到x[0],所以結果是一個形狀-0.的事情。對x[1]等重複此操作。

如果你做x.T,那麼沿着x的主軸只有1個東西,即長度100「行」。因此,可以不加修改地將其添加到y,因此不需要更多的廣播,並且您可能會想到「幼稚」矢量數學運算。

NumPy的廣播規則試圖在大量可能的計算和操作中對編程和迭代有效,許多與線性代數或常用向量/矩陣操作完全無關。因此,廣播並不總是(也不應該總是)假設事物,以便對線性代數類型的期望給予特權。

相關問題