重塑图像数组

新手上路,请多包涵

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

所以“图像”是我正在谈论的数组。

有人向我建议:

“您可能需要更改轴或组合它们才能获得所需的功能。我建议也绘制它们以防图像横向结束。确保您勤于使用轴以避免那里出现更多问题。”

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

有人可以解释我需要做什么以及为什么吗? (它能做什么)

原文由 ajfbiw.s 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 434
2 个回答

由于这是来自 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.],
 ...

原文由 hpaulj 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

原文由 Brian Huey 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题