2017-03-02 80 views
1

我碰到这行代码,使用numpy的Python - numpy的重塑

img = data.reshape(data.shape[0], 3, 32, 32) 

我明白了这行代码,除了data.shape[0]。我知道的是,这部分将返回行数。但是,我没有得到的是data(即行)将如何被重塑为matrix 3-channels。为什么没有单独使用data

也许我在这里混淆的东西?

谢谢。

+0

再次阅读文档可能会有帮助。 – Divakar

+0

'data'的形状是什么?它必须至少是2d,并且'data.shape [1:]'值与3 * 32 * 32具有相同的产品。 – hpaulj

回答

1

这样做有道理的一种方法是,如果你确切地知道最终的结果是多少维度,但你不知道有多少行;例如,

In [9]: data.shape 
Out[9]: (5, 3072) 

In [7]: img = data.reshape(data.shape[0], 3, 32, 32) # 3072 = 3*32*32 

In [10]: img.shape 
Out[10]: (5, 3, 32, 32) 
2

当重塑一个矩阵时,新形状应该与原始形状兼容。

为了动态确保这一点,此代码使用data.shape [0]来获得原始矩阵的行数(即第一维data)。知道这一点,它将矩阵重塑为一个4d矩阵,定义如下:rows | 3 | 32 | 32。

正如您所指出的那样,数组本身可能已经被使用,所以这段代码并没有检查行数的有效性,而是使用了行计数来确保行元素不会混洗到新列中在重塑期间。

1

假设你有一个包含N行的数组,每行是一个3 * 32 * 32 = 3072长阵列。如果您不确定有多少条线,但知道您希望其余的线重新成形为(3, 32, 32),则可以使用指示的线。

否则,你会得到一个错误:

>>> import numpy as np 
>>> n_lines = 10 
>>> data = np.arange(n_lines*3*32*32) 
>>> data.reshape(n_lines + 1 , 3*32*32) # notice the + 1 !! 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: total size of new array must be unchanged 

但是如果你使用正确的数字:

>>> data.reshape(n_lines, 3*32*32) 
array([[ 0,  1,  2, ..., 3069, 3070, 3071], 
     [ 3072, 3073, 3074, ..., 6141, 6142, 6143], 
     [ 6144, 6145, 6146, ..., 9213, 9214, 9215], 
     ..., 
     [21504, 21505, 21506, ..., 24573, 24574, 24575], 
     [24576, 24577, 24578, ..., 27645, 27646, 27647], 
     [27648, 27649, 27650, ..., 30717, 30718, 30719]]) 
>>> data.reshape(n_lines, 3, 32, 32) 
array([[[[ 0,  1,  2, ..., 29, 30, 31], 
     [ 32, 33, 34, ..., 61, 62, 63], 
     [ 64, 65, 66, ..., 93, 94, 95], 
     ..., 
     [ 928, 929, 930, ..., 957, 958, 959], 
     [ 960, 961, 962, ..., 989, 990, 991], 
     [ 992, 993, 994, ..., 1021, 1022, 1023]], 

     [[ 1024, 1025, 1026, ..., 
1

重塑不能改变数据的大小,但它可以改变的维数。如果原始形状是例如(10x3072)(10x3x1024)您可以将整个阵列重塑为10x3x32x32而不是9x3x32x32

显然,这段代码是为了保持第一个维度不变并重新整形数组的其余部分而编写的。无论data的实际形状是什么,如果data的尺寸是N * 3072,img将始终为Nx3x32x32。否则这会引发错误。

大概谁写的代码不知道,你可以以自动设置一个维度的大小通过-1reshape

img = data.reshape(-1, 3, 32, 32) 

这是可能的,因为数据的总大小必须保持不变。

Why didn't data alone be used?

很难说在不知道数据的前面形状,但是从名字img我会扣除重整的阵列很可能应该持有的n 32x32的RGB图像的集合。