我有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"]
所以"图像"是我正在谈论的阵列。
有人向我建议说:
"您可能需要更改轴或组合它们才能获得所需的功能。我建议也可以将它们绘制成图像,以防图像朝向侧面。确保你对你的轴很勤奋,以避免在那里出现进一步的问题。"
我不知道"轴"这里提到了如何将上述内容考虑在内。
有人可以解释我需要做什么以及为什么? (它做了什么)
答案 0 :(得分:3)
由于这是通过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.],
...
答案 1 :(得分:0)
我认为你只需要使用重塑:
>>> images = np.ndarray([60000, 28, 28])
>>> images.shape
(60000, 28, 28)
>>> images_rs = images.reshape([60000, 28*28])
>>> images_rs.shape
(60000, 784)
答案 2 :(得分:0)
您可以重新塑造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)