重塑图像数组

reshape an array of images

我将 60000 train_images 作为形状 (28,28,60000) 矩阵引入。这是一个numpy.ndarray。我想将它转换为一维图像数组,这意味着每个图像都表示为单个 line/array 数字,我想要 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" 就是我所说的数组。

有人向我建议:

"You may need to change axes or combine them do get the functionality you want. I recommend plotting them as well in case an image ends up sideways. Make sure you are diligent with your axes to avoid further problems there."

我不知道 "axes" 这里指的是什么,也不知道如何考虑上面所说的内容。

谁能解释一下我需要做什么以及为什么? (它的作用)

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

>>> 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,28,60000) 的形状很有意义 - 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 '(或 .')相同。

images也可能是order='F'.


octave:38> images=reshape(1:30,2,3,5);
octave:39> save test.mat -v7 images
octave:40> images
images =

ans(:,:,1) =

   1   3   5
   2   4   6

ans(:,:,2) =

    7    9   11
    8   10   12
....

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

在 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_images 并通过绘制图像来验证它,

重塑:

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)