2017-02-08 69 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]])