Python numpy整形

2024-03-28 11:01:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了一行使用numpy的代码:

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

我理解这一行代码,除了data.shape[0]。我知道的是这个部分将返回行数。但是,我没有弄清楚data(即行)将如何用3-channels来重塑32x32矩阵。为什么不单独使用data?在

也许我把事情搞糊涂了?在

谢谢。在


Tags: 代码numpyimgdata矩阵事情channelsshape
3条回答

重塑矩阵时,新形状应与原始形状兼容。在

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

正如您所指出的,数组本身可能已经被使用,所以这段代码并没有检查行数的有效性,而是使用行计数来确保在整形过程中不会将行元素重新排列到新列中。在

假设有一个数组,其中有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

但如果您使用正确的号码:

^{pr2}$

有一种方法是,如果您确切地知道最终的维是如何组织的,但是您不确切地知道有多少行;例如

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)

相关问题 更多 >