2015-04-15 60 views
0

我試着輸入向量做成numpy的矩陣:如何獲得這些形狀排隊的numpy的矩陣

eigvec[:,i] = null 

不過,我不斷收到錯誤:

ValueError: could not broadcast input array from shape (20,1) into shape (20) 

我已經使用flattenreshape嘗試,但似乎沒有任何工作

+0

'eigvec.shape'給你什麼? – lightalchemist

+0

eigvec是(20,20) – Chris

+3

另外,什麼是'null'定義爲?它不是一個Python關鍵字。 – lightalchemist

回答

1

我可以猜測,

eigvec[:,i] = null.flat 

會工作(但null.flatten()也應該工作)。事實上,它看起來像NumPy抱怨,因爲你正在分配一個僞1D數組(形狀(20,1))到被認爲是不同方向的一維數組(形狀(1,20),如果你願意的話)。

另一個解決方案是:

eigvec[:,i] = null.T 

,你正確移調 「矢量」 null

這裏的基本點是NumPy具有「廣播」規則,用於在具有不同維數的數組之間進行轉換。在2D和1D之間轉換的情況下,將大小爲n的一維數組廣播到形狀(1,n)(而不是(n,1))的二維數組中。更一般地說,缺少的尺寸被添加到原始尺寸的左側。 (20,)變成(1,20)(而不是(20,1)),因此觀察到的錯誤消息基本上說形狀(20,)和(20,1)是不兼容的。事實上,一個是列矩陣,而另一個是行矩陣。

+0

如錯誤消息所述,賦值目標的形狀爲(20),而不是(20,1)。其餘的都是正確的。 –

+0

我不確定我是否關注你:我不是說目標*具有*形狀(20,1):我說的是NumPy將「指定給一維數組」--so,而不是2D形狀(20,1) )。我也暗示,雖然人們可以認爲這個20個元素的1D數組可以被自動轉換爲形狀(20,1),但實際上它被NumPy *視爲形狀(1,20),因此錯誤消息(和'null.T'解決方案)。 – EOL

+1

我只是認爲你原來的措辭有點令人困惑,但你的編輯更清晰(無論如何,我高舉你的原始答案) –

1

錯誤信息中的形狀是一個很好的線索。

In [161]: x = np.zeros((10,10)) 

In [162]: x[:,1] = np.ones((1,10)) # or x[:,1] = np.ones(10) 

In [163]: x[:,1] = np.ones((10,1)) 
... 
ValueError: could not broadcast input array from shape (10,1) into shape (10) 
In [166]: x[:,1].shape 
Out[166]: (10,) 
In [167]: x[:,[1]].shape 
Out[167]: (10, 1) 

In [168]: x[:,[1]] = np.ones((10,1)) 

當目標的形狀與新值的形狀匹配時,複製起作用。它也適用於可以「廣播」以適應新價值的一些情況。但它並沒有嘗試更普遍的重塑。另請注意,使用標量索引可降低維度。