簡體   English   中英

如何確定numpy-array重塑策略

[英]How to determine a numpy-array reshape strategy

對於python項目,我經常發現自己正在重塑和重新排列n維numpy數組。 但是,我很難確定如何處理問題,可視化重塑方法結果的結果,並且知道我的解決方案是有效的。

在遇到這樣的問題的那一刻,我的策略是啟動ipython,加載一些樣本數據並進行反復試驗,直到找到transpose()s,reshape()和swapaxes()的組合。 獲得了理想的結果。 它完成了工作,但沒有真正了解正在發生的事情,並且經常產生難以維護的代碼。

所以,我的問題是找到一個策略。 你怎么處理這樣的問題? 當你必須以所需的格式塑造它時,你如何想象你頭腦中的ndarray? 你是如何做出正確的行動的?

為了使回答更具體,一個例子:

假設您要重塑以下3d數組

array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],

       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])

到2d陣列,其中第三維的第一列放在第一,第二列放在第二,......等

結果應如下所示:

array([[ 0,  9, 18,  3, 12, 21,  6, 15, 24],
       [ 1, 10, 19,  4, 13, 22,  7, 16, 25],
       [ 2, 11, 20,  5, 14, 23,  8, 17, 26]])

PS。 關於這個主題的任何閱讀材料都會很棒!

我經常在ipython玩形狀。 但是,為了使事情更清楚,我從具有不同維度的數組開始。

arr = np.arange(3*4*5).reshape(3,4,5)

這樣,更容易識別軸的移動方式,例如:

In [25]: arr.shape
Out[25]: (3, 4, 5)

In [26]: arr.T.shape
Out[26]: (5, 4, 3)

In [31]: arr.T.reshape(5,-1)
Out[31]: 
array([[ 0, 20, 40,  5, 25, 45, 10, 30, 50, 15, 35, 55],
       [ 1, 21, 41,  6, 26, 46, 11, 31, 51, 16, 36, 56],
       [ 2, 22, 42,  7, 27, 47, 12, 32, 52, 17, 37, 57],
       [ 3, 23, 43,  8, 28, 48, 13, 33, 53, 18, 38, 58],
       [ 4, 24, 44,  9, 29, 49, 14, 34, 54, 19, 39, 59]])

在哪里作為一個不同的轉置(不切換3,4的順序)

In [38]: np.transpose(arr,[2,0,1]).shape
Out[38]: (5, 3, 4)

In [39]: np.transpose(arr,[2,0,1]).reshape(5,-1)
Out[39]: 
array([[ 0,  5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55],
       [ 1,  6, 11, 16, 21, 26, 31, 36, 41, 46, 51, 56],
       [ 2,  7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57],
       [ 3,  8, 13, 18, 23, 28, 33, 38, 43, 48, 53, 58],
       [ 4,  9, 14, 19, 24, 29, 34, 39, 44, 49, 54, 59]])

在開發函數時,我也喜歡使用像這樣“奇怪”形狀的數組。 這樣,如果我搞砸了一些轉置或廣播,尺寸錯誤就會突然出現在我面前。 經驗告訴我,一旦我得到正確的尺寸,價值也將是正確的。 或者至少影響值的錯誤類別與影響維度的錯誤類別完全不同。

我還可以使用print arr.shape like語句來開發代碼,甚至可以assert x.shape==y.shape斷言。

它還有助於標注尺寸:

M, N, L = 3, 4, 5
np.empty((M,N,L))

或者喜歡在einsum

np.einsum('ijk,kj->i', A, B) # if A is (M,N,L), B must be (L,N)

https://stackoverflow.com/a/29903842/901925是嘗試理解和解釋rollaxis一個例子。

另一個策略是查看numpy函數的Python代碼。 他們經常接受axis參數。 看看他們如何使用它們是有益的。 有時,特定axis旋轉到前面或末端。 有時將一個nd數組重新整形為一個二維數組,將所有軸折疊,除了一個到一個。 其他通過構造和操縱索引元組來實現通用性。 更高級的功能與步幅和形狀一起發揮作用。

維度應該是第一個還是最后一個通常是一個優化問題 - 並且可能涉及易用性(廣播,索引)和速度之間的權衡。 請記住,對於“C”順序,最后一個維度形成連續的塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM