从 MNIST 重塑数组

Reshape arrays from MNIST

我正在使用 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()

这是我得到的:

问题在于您堆叠数组然后重塑的方式。 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))

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

您的代码的作用:

如果你仔细观察,并排出现的两个零并不完全相同。发生的情况是前 28 个像素是 zero 数组的第一行。同一行中接下来的 28 zero 数组的第二行。因此它并排渲染两个零,其中第一个(左边)一个是每个偶数像素行(从 0 开始的索引),右边一个是每个奇数像素行。

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

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