Python 重塑图像阵列的形状
我有60000张train_图像作为形状矩阵(28,2860000)引入。这是一场婚礼。我想把它转换成一维图像的数组,也就是说,每个图像都表示为一行/一组数字,我想要60000个数组。换句话说,我想从(28,28,60000)到(60000,28*28)。在python中,它将是:Python 重塑图像阵列的形状,python,arrays,numpy,reshape,Python,Arrays,Numpy,Reshape,我有60000张train_图像作为形状矩阵(28,2860000)引入。这是一场婚礼。我想把它转换成一维图像的数组,也就是说,每个图像都表示为一行/一组数字,我想要60000个数组。换句话说,我想从(28,28,60000)到(60000,28*28)。在python中,它将是: images_features = [] for image in images: imageLine = [] for y in range(len(image)): for x i
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"]
所以“图像”就是我所说的阵列
有人向我建议:
“您可能需要更改轴或组合轴才能获得所需的功能。我建议您也可以打印轴,以防图像出现侧向。请确保仔细使用轴,以避免出现进一步的问题。”
我不知道这里指的是什么“轴”,也不知道如何考虑上面所说的
有人能解释一下我需要做什么以及为什么吗?(它的功能)我认为您只需要使用重塑:
>>> images = np.ndarray([60000, 28, 28])
>>> images.shape
(60000, 28, 28)
>>> images_rs = images.reshape([60000, 28*28])
>>> images_rs.shape
(60000, 784)
由于这是通过
loadmat
实现的,因此(28,2860000)
的形状是有意义的-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的'
(或'
)相同
图像
也可以是order='F'
我选择了较小的测试尺寸,以便于区分不同的轴 在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.],
...
您可以重塑
序列图像
,并通过打印图像进行验证
重塑:
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)
如果希望输出为python列表(或者不包含
tolist()
),则可能是images.reformate(-1).tolist()
),那么-1的作用是什么?我需要一个1乘28^2乘60000的数组。很抱歉我读错了。-1
将矩阵完全展平(这不是您想要的)。你可以看看numpy文档,如果我理解的很好,images.reformate(-16000)
可以吗?提供60000个功能和784个值。要将输出作为包含60000个特性的python列表:images.reformate(-1600).T.tolist()
image.transpose(2,0,1)
或image.transpose(2,1,0)
?应该是images.reforme([60000,28*28])还是images.reforme([28*28,60000])?区别是什么?在我的评论中,我使用了一个28,28,60000
的形状来匹配您在问题中所说的数字,但是restrape
不会抱怨,因为数组的大小没有改变(并且使用60000,28*28
而不是28*28,60000
,输出可能会按照您的意愿更加有序).我想如果你有60000张个人图片,那应该是第一维度。您将拥有一个包含60000个长度为784的数组。在(28*28 x 60000)的情况下,您将有一个包含784(28*28)个长度为60000的数组。结果表明,答案中建议的方法不正确。结果矩阵的大小正确,但内容不正确。因此我会:images=images.transpose()。重塑(60000,-1)?如果是,如何决定是否使用默认转置而不是2,0,1?因此,从上面的示例来看,它看起来像是数据['images']。转置([2,1,0])。重塑(5,-1)是正确的,其中2,1,0是转置的默认设置。
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)