【问题标题】:Reshape arrays from MNIST从 MNIST 重塑数组
【发布时间】:2018-05-22 12:49:19
【问题描述】:

我正在使用 mnist 数据集并想一次绘制一些数字。该数据集为我提供了形状为(784, ) 的数组,并表示一个 28x28 像素的图像。

假设我想在 2x2 网格中绘制 4 个数字。该网格的形状应为(2*28, 2*28)。这是我想要的结果:

+---+---+
| 0 | 9 |
+---+---+
| 9 | 0 |
+---+---+

这是我的代码:

zero # an array from the mnist dataset
nine # another array from the mnist dataset

zero.shape
#(784,)
nine.shape
#(784,)

x = np.stack([zero, nine, zero, nine])
x.shape
# (4, 784)

imshow(x.reshape(2*28, 2*28))
show()

这是我得到的:

【问题讨论】:

    标签: python numpy reshape mnist


    【解决方案1】:

    问题在于您堆叠数组然后重新整形的方式。 Numpy 通过逐行来重塑数组。下面的代码实现了你想要的:

    upper_layer = np.append(zero.reshape(28, 28), nine.reshape(28, 28), axis=1)
    lower_layer = np.append(nine.reshape(28, 28), zero.reshape(28, 28), axis=1) 
    
    layout = np.stack([upper_layer, lower_layer])
    plt.imshow(layout.reshape(2*28, 2*28))
    

    (我使用随机生成的 np 数组,因为我无法快速访问 MNIST 数据)

    您的代码的作用:

    如果您非常仔细地注意到,并排出现的两个零并不相同。发生的事情是前 28 个像素是 zero 数组的第一行。接下来的 28 个在同一行zero 数组的第二行。因此它会并排渲染两个零,其中第一个(左侧)是每个偶数像素行(从 0 开始的索引),而右侧是每个奇数像素行。

    reshaped = np.stack([zero, nine, zero, nine]).reshape(2*28, 2*28)
    plt.imshow(reshaped)
    

    请注意蓝色值如何从顶部开始在 y 轴上仅达到 14,这是因为它将两个原始 (1x28) 行渲染为单个 (1x56) 行。

    【讨论】:

    • 啊,非常感谢您的解释。现在这对我来说确实有意义。
    猜你喜欢
    • 2020-02-26
    • 2019-03-25
    • 1970-01-01
    • 2017-12-26
    • 2021-05-08
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 2017-06-10
    相关资源
    最近更新 更多