2016-03-14 314 views
2

我有一個3D矩陣X,它包含向量作爲第三維的行。我想提取每個這樣的矢量X(:, x, y)並將其保存爲2D矩陣,使得X(:, 0, 0)是2D矩陣的第一行,X(:, 0, 1)第二行,依此類推。下面原油的圖形可能有助於說明這一點:將3D矩陣轉換/重塑爲2D矩陣

Crude Sketch

我知道我可以創建新的二維矩陣,然後遍歷原來X添加的載體,但有人對如何做一些輸入這快速和有效?


實例:假設

>>> a = np.arange(9*3).reshape(3,3,3) 
>>> a 
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]]]) 

我想獲得以下爲行,雖然行的順序並不重要:

array([[ 0, 9, 18], 
     [ 1, 10, 19]], 
     ...) 

回答

1

使用np.transpose然後reshape像所以 -

X.transpose(1,2,0).reshape(-1,X.shape[0]) 

解釋 -

1)你想形成斷X[:, 0, 0]X[:, 0, 1]等的行,即,我們以「推」 axis=0元件以這樣的2D陣列輸出的最後軸線。接下來,我們必須確定行的順序,這將從axes=1,2中形成。現在,回到第一行和第二行之間即在X[:, 0, 0]X[:, 0, 1],axis=1之間的期望的2D陣列輸出保持不變。因此,在二維數組輸出中,第二個軸(axis = 1)優先於第三個軸(axis = 2)。所以,在X我們推axis=1axis=0axis=2axis=1。因爲,如前所述axis=0X必須被移動到最後一個軸,所以這將是axis=2。所有這些都可以通過X.transpose(1,2,0)完成。我們稱之爲Y

2)。最後,我們要重塑Y2D陣列,使得每行中的元素的數量是相同X.shape[0],這是通過Y.reshape(-1,X.shape[0])實現。因此,最終的解決方案成爲 -

X.transpose(1,2,0).reshape(-1,X.shape[0]) 

採樣運行 -

In [25]: X 
Out[25]: 
array([[[ 0.19508052, 0.02481975], 
     [ 0.88915956, 0.95974095]], 

     [[ 0.23271151, 0.14730822], 
     [ 0.56763563, 0.30607283]], 

     [[ 0.33259228, 0.42552102], 
     [ 0.28950926, 0.47782175]]]) 

In [26]: X[:, 0, 0] 
Out[26]: array([ 0.19508052, 0.23271151, 0.33259228]) 

In [27]: X[:, 0, 1] 
Out[27]: array([ 0.02481975, 0.14730822, 0.42552102]) 

In [28]: X[:, 1, 0] 
Out[28]: array([ 0.88915956, 0.56763563, 0.28950926]) 

In [29]: X[:, 1, 1] 
Out[29]: array([ 0.95974095, 0.30607283, 0.47782175]) 

In [30]: X.transpose(1,2,0).reshape(-1,X.shape[0]) 
Out[30]: 
array([[ 0.19508052, 0.23271151, 0.33259228], 
     [ 0.02481975, 0.14730822, 0.42552102], 
     [ 0.88915956, 0.56763563, 0.28950926], 
     [ 0.95974095, 0.30607283, 0.47782175]]) 
+0

遺憾的混亂!行的順序對我的應用程序來說並不重要,或者沒關係。 – fabian789

+1

@ fabian789查看編輯後的評論是否有幫助。 – Divakar

+0

非常感謝,很有道理! – fabian789