2017-02-08 101 views
0

我有一個多維數組形狀(15000,1,96,96),其中每個96 * 96矩陣表示一個圖像。我想把它的形狀改成(15000,96,96,1).關於重塑一個多維數組

我可以用a=a.reshape(15000,96,96,1)來做嗎?這是正確的方式嗎?

+3

您可以使用'reshape',但是如果這是正確的方式取決於你想要的結果。更有可能你會想要使用['transpose'](https://docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html),你可以重新排列數組的維數:'a .transpose(0,2,3,1)' – kazemakase

+1

您可以使用更小的陣列重塑來演示'right'結果嗎? –

回答

1

對於您的具體示例,您需要用最後一個轉置第二個維度。

例如:

a = np.zeros((10,1,96,96)) 
print(a.shape) 
>>> (10, 1, 96, 96) 

a = a.transpose(0,2,3,1) 
print(a.shape) 
>>> (10, 96, 96, 1) 
+0

謝謝,一般來說,在解決這類問題方面,使用重塑vs轉置的優缺點是什麼。 – user288609

+0

它們實際上是兩個非常不同的功能。 ((2,2,3)) 作爲3D陣列的示例:a = np.arange(12).reshape((2,2,3)) a.reshape((3,2,2)) a.transpose((2, 0,1)) –

+0

您可以將整形作爲第一次散列(使用給定的索引順序),然​​後使用與用於散列相同類型的索引排序將散列數組中的元素插入到新數組中。雖然轉置不會破壞陣列;它做張量的換位。所以他們做不同的任務; 由於散亂和解散;重塑將改變數組中元素的順序; – OddNorg

1

要完成@OddNorg的評論,這裏有一個例子:

比方說,你有3個圖像,您可以使用transpose method在numpy的陣列洗牌尺寸大小(2 * 2):

>>>img0 = [[0,0],[0,0]] 
>>>img1 = [[1,1],[1,1]] 
>>>img2 = [[2,2],[2,2]] 
>>>imgs = np.concatenate([[img0],[img1],[img2]]) 
array([[[0, 0], 
     [0, 0]], 

     [[1, 1], 
     [1, 1]], 

     [[2, 2], 
     [2, 2]]]) 
>>>imgs.shape 
(3,2,2) 

現在我們想要在第一個和第二個維度而不是第二個和第三個維度的像素。

如果我們使用重塑它不會達到預期效果:

>>>imgs_r = imgs.reshape((2,2,3)) 
>>>imgs_r[:,:,0] 
array([[0, 0], 
     [1, 2]]) 

第一圖像進行修改

與轉置它的正常工作和圖像不會被修改:

>>>imgs_t = imgs.tranpose((1,2,0)) 
>>>imgs_t[:,:,0] 
array([[0, 0], 
     [0, 0]])