我試着輸入向量做成numpy的矩陣:如何獲得這些形狀排隊的numpy的矩陣
eigvec[:,i] = null
不過,我不斷收到錯誤:
ValueError: could not broadcast input array from shape (20,1) into shape (20)
我已經使用flatten
和reshape
嘗試,但似乎沒有任何工作
我試着輸入向量做成numpy的矩陣:如何獲得這些形狀排隊的numpy的矩陣
eigvec[:,i] = null
不過,我不斷收到錯誤:
ValueError: could not broadcast input array from shape (20,1) into shape (20)
我已經使用flatten
和reshape
嘗試,但似乎沒有任何工作
我可以猜測,
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)是不兼容的。事實上,一個是列矩陣,而另一個是行矩陣。
如錯誤消息所述,賦值目標的形狀爲(20),而不是(20,1)。其餘的都是正確的。 –
我不確定我是否關注你:我不是說目標*具有*形狀(20,1):我說的是NumPy將「指定給一維數組」--so,而不是2D形狀(20,1) )。我也暗示,雖然人們可以認爲這個20個元素的1D數組可以被自動轉換爲形狀(20,1),但實際上它被NumPy *視爲形狀(1,20),因此錯誤消息(和'null.T'解決方案)。 – EOL
我只是認爲你原來的措辭有點令人困惑,但你的編輯更清晰(無論如何,我高舉你的原始答案) –
錯誤信息中的形狀是一個很好的線索。
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))
當目標的形狀與新值的形狀匹配時,複製起作用。它也適用於可以「廣播」以適應新價值的一些情況。但它並沒有嘗試更普遍的重塑。另請注意,使用標量索引可降低維度。
'eigvec.shape'給你什麼? – lightalchemist
eigvec是(20,20) – Chris
另外,什麼是'null'定義爲?它不是一個Python關鍵字。 – lightalchemist