1 回答
TA贡献1966条经验 获得超4个赞
3 个嵌套for循环,带有if条件,同时整形和追加显然不是一个好主意;numpy.roll以矢量方式完美地完成了这项工作:
import numpy as np
import matplotlib.pyplot as plt
from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train.shape
# (60000, 28, 28)
# plot an original image
plt.gray()
plt.matshow(x_train[0])
plt.show()
我们先演示一下操作:
# one pixel down:
x_down = np.roll(x_train[0], 1, axis=0)
plt.gray()
plt.matshow(x_down)
plt.show()
# one pixel up:
x_up = np.roll(x_train[0], -1, axis=0)
plt.gray()
plt.matshow(x_up)
plt.show()
# one pixel left:
x_left = np.roll(x_train[0], -1, axis=1)
plt.gray()
plt.matshow(x_left)
plt.show()
# one pixel right:
x_right = np.roll(x_train[0], 1, axis=1)
plt.gray()
plt.matshow(x_right)
plt.show()
确定了这一点后,我们可以简单地生成所有训练图像的“正确”版本
x_all_right = [np.roll(x, 1, axis=1) for x in x_train]
对于其他 3 个方向也是如此。
让我们确认第一张图片x_all_right确实是我们想要的:
plt.gray()
plt.matshow(x_all_right[0])
plt.show()
您甚至可以避免最后一个列表理解,而使用纯 Numpy 代码,如
x_all_right = np.roll(x_train, 1, axis=2)
这更有效,虽然稍微不那么直观(只需采用相应的单图像命令版本并增加axis
1)。
添加回答
举报