2013-10-20 112 views
3

我有一個數組,看起來像如下:使用Python中的重塑,重塑一個數組

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

如何使用重塑把它分成4個吸盤,使得它看起來像

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

我嘗試了重塑(m,n,l)中m,n,l的不同整數組合,但沒有任何作用。

+0

和你打算得到一個三維數組或你想二維數組出來? – tacaswell

回答

8

編輯:對不起,我d沒有意識到這是一個三維結果,而不是一個四維結果。要獲得三維圖像,您將不得不重新整形。並且額外重塑複製數據。

你不能,你需要TRANSPOSE(移調),以及:

In [1]: a = np.arange(8)[:,None].repeat(8,axis=1) 

In [2]: a 
Out[2]: 
array([[0, 0, 0, 0, 0, 0, 0, 0], 
     [1, 1, 1, 1, 1, 1, 1, 1], 
     [2, 2, 2, 2, 2, 2, 2, 2], 
     [3, 3, 3, 3, 3, 3, 3, 3], 
     [4, 4, 4, 4, 4, 4, 4, 4], 
     [5, 5, 5, 5, 5, 5, 5, 5], 
     [6, 6, 6, 6, 6, 6, 6, 6], 
     [7, 7, 7, 7, 7, 7, 7, 7]]) 

In [3]: b = a.reshape(2,4,2,4) 

In [4]: b 
Out[4]: 
array([[[[0, 0, 0, 0], 
     [0, 0, 0, 0]], 
     ... 
     [[7, 7, 7, 7], 
     [7, 7, 7, 7]]]]) 

In [5]: b.transpose(0,2,1,3) 
Out[5]: 
array([[[[0, 0, 0, 0], 
     [1, 1, 1, 1], 
     [2, 2, 2, 2], 
     [3, 3, 3, 3]], 

     [[0, 0, 0, 0], 
     [1, 1, 1, 1], 
     [2, 2, 2, 2], 
     [3, 3, 3, 3]]], 


     [[[4, 4, 4, 4], 
     [5, 5, 5, 5], 
     [6, 6, 6, 6], 
     [7, 7, 7, 7]], 

     [[4, 4, 4, 4], 
     [5, 5, 5, 5], 
     [6, 6, 6, 6], 
     [7, 7, 7, 7]]]]) 
5

在所有numpy數組下面(實際上,所有數組(非鏈表))都是線性的內存塊,所以您的解釋會將更高維的特性放在它上面。考慮的方法是[i, j]元素是真的是元素[i * num_cols + j]在底層數組中。

Numpy爲您提供所有步驟細節,讓您輕鬆使用任何您想要的維度索引到內存中,但您有約束條件,即只能將數據重新組合到數組中,您可以在其中編寫規則就像上面的轉換(i,j) - >一個單一的索引,這是你想要的不。

還有一堆的方式,你可以做你想做的,但它們都涉及複製數據

In [6]: array([[0, 0, 0, 0, 0, 0, 0, 0], 
     [1, 1, 1, 1, 1, 1, 1, 1], 
     [2, 2, 2, 2, 2, 2, 2, 2], 
     [3, 3, 3, 3, 3, 3, 3, 3], 
     [4, 4, 4, 4, 4, 4, 4, 4], 
     [5, 5, 5, 5, 5, 5, 5, 5], 
     [6, 6, 6, 6, 6, 6, 6, 6], 
     [7, 7, 7, 7, 7, 7, 7, 7]]).reshape(-1, 4)[np.r_[range(0, 8, 2), range(1, 8, 2), range(8, 16, 2), range(9, 16, 2)]].reshape(4, 4, 4) 
Out[6]: 
array([[0, 0, 0, 0], 
     [1, 1, 1, 1], 
     [2, 2, 2, 2], 
     [3, 3, 3, 3], 
     [0, 0, 0, 0], 
     [1, 1, 1, 1], 
     [2, 2, 2, 2], 
     [3, 3, 3, 3], 
     [4, 4, 4, 4], 
     [5, 5, 5, 5], 
     [6, 6, 6, 6], 
     [7, 7, 7, 7], 
     [4, 4, 4, 4], 
     [5, 5, 5, 5], 
     [6, 6, 6, 6], 
     [7, 7, 7, 7]]) 

或假設你的陣列是a

In [10]: np.vstack([a[:4, :4], a[:4, 4:], a[4:, :4], a[4:, 4:]]) 
Out[10]: 
array([[0, 0, 0, 0], 
     [1, 1, 1, 1], 
     [2, 2, 2, 2], 
     [3, 3, 3, 3], 
     [0, 0, 0, 0], 
     [1, 1, 1, 1], 
     [2, 2, 2, 2], 
     [3, 3, 3, 3], 
     [4, 4, 4, 4], 
     [5, 5, 5, 5], 
     [6, 6, 6, 6], 
     [7, 7, 7, 7], 
     [4, 4, 4, 4], 
     [5, 5, 5, 5], 
     [6, 6, 6, 6], 
     [7, 7, 7, 7]]).reshape(4, 4, 4) 

或只是

np.array([a[:4, :4], a[:4, 4:], a[4:, :4], a[4:, 4:]]) 
+0

@seberg我對numpy的膽量的理解顯然是有限的,你能指出我的一些細節嗎?我認爲當你創建新的數組時(特別是在vstack中)你最終會得到副本。 – tacaswell

+0

基本上,numpy使用了一個分步佈局,這意味着你可以任意切片/轉置而不需要複製。當您拆分尺寸時,重塑也不會複製(可能需要以其他方式複製)。在這裏,你是對的,因爲它是一個重塑+轉置+重塑,你需要一個副本。 – seberg

+0

@seberg這就是我想我想說的。 – tacaswell