Python 重塑图像阵列的形状

Python 重塑图像阵列的形状,python,arrays,numpy,reshape,Python,Arrays,Numpy,Reshape,我有60000张train_图像作为形状矩阵(28,2860000)引入。这是一场婚礼。我想把它转换成一维图像的数组,也就是说,每个图像都表示为一行/一组数字,我想要60000个数组。换句话说,我想从(28,28,60000)到(60000,28*28)。在python中,它将是: images_features = [] for image in images: imageLine = [] for y in range(len(image)): for x i

我有60000张train_图像作为形状矩阵(28,2860000)引入。这是一场婚礼。我想把它转换成一维图像的数组,也就是说,每个图像都表示为一行/一组数字,我想要60000个数组。换句话说,我想从(28,28,60000)到(60000,28*28)。在python中,它将是:

images_features = []
for image in images:
    imageLine = []
    for y in range(len(image)):
        for x in range(len(image[0])):
            imageLine.append(image[y][x])
    images_features.append(imageLine)
我该怎么做?我怀疑我需要使用重塑,但我不知道如何才能做到这一点

这就是我获取图像的方式:

data = scipy.io.loadmat('train.mat')


images = data["train_images"]
所以“图像”就是我所说的阵列

有人向我建议:

“您可能需要更改轴或组合轴才能获得所需的功能。我建议您也可以打印轴,以防图像出现侧向。请确保仔细使用轴,以避免出现进一步的问题。”

我不知道这里指的是什么“轴”,也不知道如何考虑上面所说的


有人能解释一下我需要做什么以及为什么吗?(它的功能)

我认为您只需要使用重塑:

>>> images = np.ndarray([60000, 28, 28])
>>> images.shape
(60000, 28, 28)
>>> images_rs = images.reshape([60000, 28*28])
>>> images_rs.shape
(60000, 784)

由于这是通过
loadmat
实现的,因此
(28,2860000)
的形状是有意义的-MATLAB从最后一个索引开始迭代

images.transpose()  # or images.T
重新排列轴,因此结果为
(60000,28,28)
。最后两个尺寸可以与重塑相结合

images.T.reshape(60000,28*28)
images.T.reshape(60000,-1)   # short hand
您需要对28x28图像进行转置,例如

images.transpose([2,0,1])  # instead of the default [2,1,0]
.T
与MATLAB的
'
(或
'
)相同

图像
也可以是
order='F'


我选择了较小的测试尺寸,以便于区分不同的轴

在Ipython会话中:

In [15]: data=io.loadmat('test.mat')

In [16]: data
Out[16]: 
{'__globals__': [],
 '__header__': 'MATLAB 5.0 MAT-file, written by Octave 3.8.2, 2016-02-10 05:19:18 UTC',
 '__version__': '1.0',
 'images': array([[[  1.,   7.,  13.,  19.,  25.],
        [  3.,   9.,  15.,  21.,  27.],
        [  5.,  11.,  17.,  23.,  29.]],

       [[  2.,   8.,  14.,  20.,  26.],
        [  4.,  10.,  16.,  22.,  28.],
        [  6.,  12.,  18.,  24.,  30.]]])}

In [18]: data['images'].T
Out[18]: 
array([[[  1.,   2.],
        [  3.,   4.],
        [  5.,   6.]],

       [[  7.,   8.],
        [  9.,  10.],
        [ 11.,  12.]],
....
In [19]: data['images'].transpose([2,0,1])
Out[19]: 
array([[[  1.,   3.,   5.],
        [  2.,   4.,   6.]],

       [[  7.,   9.,  11.],
        [  8.,  10.,  12.]],
 ....
In [22]: data['images'].transpose([2,1,0]).reshape(5,-1)
Out[22]: 
array([[  1.,   2.,   3.,   4.,   5.,   6.],
       [  7.,   8.,   9.,  10.,  11.,  12.],
 ...

您可以重塑
序列图像
,并通过打印图像进行验证

重塑:

train_features_images = train_images.reshape(train_images.shape[0],28,28) 
打印图像:

import matplotlib.pyplot as plt
def show_images(features_images,labels,start, howmany):
    for i in range(start, start+howmany):
        plt.figure(i)
        plt.imshow(features_images[i], cmap=plt.get_cmap('gray'))
        plt.title(labels[i])
    plt.show()
show_images(train_features_images, labels, 1, 10)

如果希望输出为python列表(或者不包含
tolist()
),则可能是
images.reformate(-1).tolist()
),那么-1的作用是什么?我需要一个1乘28^2乘60000的数组。很抱歉我读错了。
-1
将矩阵完全展平(这不是您想要的)。你可以看看numpy文档,如果我理解的很好,
images.reformate(-16000)
可以吗?提供60000个功能和784个值。要将输出作为包含60000个特性的python列表:
images.reformate(-1600).T.tolist()
image.transpose(2,0,1)
image.transpose(2,1,0)
?应该是images.reforme([60000,28*28])还是images.reforme([28*28,60000])?区别是什么?在我的评论中,我使用了一个
28,28,60000
的形状来匹配您在问题中所说的数字,但是
restrape
不会抱怨,因为数组的大小没有改变(并且使用
60000,28*28
而不是
28*28,60000
,输出可能会按照您的意愿更加有序).我想如果你有60000张个人图片,那应该是第一维度。您将拥有一个包含60000个长度为784的数组。在(28*28 x 60000)的情况下,您将有一个包含784(28*28)个长度为60000的数组。结果表明,答案中建议的方法不正确。结果矩阵的大小正确,但内容不正确。因此我会:images=images.transpose()。重塑(60000,-1)?如果是,如何决定是否使用默认转置而不是2,0,1?因此,从上面的示例来看,它看起来像是数据['images']。转置([2,1,0])。重塑(5,-1)是正确的,其中2,1,0是转置的默认设置。
import matplotlib.pyplot as plt
def show_images(features_images,labels,start, howmany):
    for i in range(start, start+howmany):
        plt.figure(i)
        plt.imshow(features_images[i], cmap=plt.get_cmap('gray'))
        plt.title(labels[i])
    plt.show()
show_images(train_features_images, labels, 1, 10)