我偶然发现了这行使用numpy
的代码
img = data.reshape(data.shape[0], 3, 32, 32)
我理解这行代码,除了data.shape[0]
。我所知道的是,这部分将返回行数。但是,我没有得到的是,如何使用3-channels
将data
(即行)重塑为32x32
矩阵。为什么不单独使用data
?
也许我把事情搞混了?
谢谢。
发布于 2017-03-02 17:13:27
重塑矩阵时,新形状应与原始形状兼容。
为了动态地确保这一点,此代码使用data.shape
来获取原始矩阵的行数(即data
的第一个维度)。了解了这一点,它将矩阵重塑为定义为:row|3|32|32的4维矩阵。
正如您所指出的,可以使用数组本身,因此此代码不会检查行数的有效性,而是使用行数来确保在整形过程中不会将行元素拖入新列。
发布于 2017-03-02 17:30:23
重塑不能改变数据的大小,但它可以改变维数。如果原始形状为(10x3072)
或(10x3x1024)
,则可以将整个数组重塑为10x3x32x32
,但不能重塑为9x3x32x32
。
显然,这段代码的目的是保持第一维不变,并重塑数组的其余部分。无论data
的实际形状是什么,如果img
的大小为N*3072时,data
将始终为Nx3x32x32。否则这将抛出一个错误。
可能编写代码的人不知道您可以将-1
传递给reshape
以自动设置一个维度的大小:
img = data.reshape(-1, 3, 32, 32)
这是可能的,因为数据的总大小必须保持不变。
为什么不单独使用数据?
在不知道之前的数据形状的情况下很难说,但从名称img
我可以推断,重塑的数组很可能包含n
32x32RGB图像的集合。
发布于 2017-03-02 16:58:39
一种可能有意义的方法是,如果您确切地知道最终的维度是如何组织的,但您不确切地知道有多少行;例如,
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)
https://stackoverflow.com/questions/42561313
复制相似问题