重新定形numpy阵列并定期堆叠成3D

时间:2017-03-31 02:21:51

标签: python image python-2.7 numpy

我有一些时间将有序图像存储为具有形状(60000,784)的numpy 2D阵列。我想最终将数据重塑为(1200,28,28,50)。我要做的是将50张28x28图像放在后面的堆叠中,其中顶部图像是最早的图像。

我认为以下代码让我开始,但这会返回1200个形状图像的列表(50,28,28)。我想要一个有形状的numpy阵列(1200,28,28,50)。

import numpy as np

X = np.ones((60000, 784))
X = X.reshape(X.shape[0], 28, 28)

X_new = []
prev = 0
for i in range(50, len(X)+50, 50):
    X_new.append(np.dstack( [X[prev:i]] ))
    prev += i

#print type(X_new)     # 'list'
#print len(X_new)      # 1200
#print X_new[0].shape  # (50, 28, 28)

2 个答案:

答案 0 :(得分:2)

我认为你需要在重塑后转置一些轴:

New
11070 2\n0 1\n1 2\n1 1\n2 ...
14070 2\n0 1\n1 2\n1 1\n2 ...
14070 2\n0 1\n1 2\n1 1\n2 ...
15070 2\n0 1\n1 2\n1 1\n2 ...
15070 2\n0 1\n1 2\n1 1\n2 ...

In [792]: X = np.ones((60000,784),int) In [793]: X1 = X.reshape(1200,50,28,28) In [794]: X2 = X1.transpose([0,2,3,1]) In [795]: X2.shape Out[795]: (1200, 28, 28, 50) 的数组不是非常具有诊断性,我不打算生成这样大小的真实图像。

小测试用例:

ones

答案 1 :(得分:1)

您应该能够重塑初始数组并保持图像有序。例如:

# Get an array of length 60000, where each element is 784 numbers ranging from 1 to 60000 (so we can keep track)
X = np.outer(np.arange(1,60001,1),np.ones(784))

Y = X.reshape(1200, 28, 28, 50)

检查:

Y[0] = [ 28x28 array of 1's, 28x28 array of 2's, ..., 28x28 array of 50's]
Y[1] = [ 28x28 array of 51's, 28x28 array of 52's, ..., 28x28 array of 100's]
Y[2] = [ 28x28 array of 101's, 28x28 array of 102's, ..., 28x28 array of 150's]

因此,您可以看到图像按照正确的顺序堆叠在50个组中。

编辑:

感谢评论,它应该是:

Y = X.reshape(1200, 50, 28, 28)

要检查这是否有效:

X = np.outer(np.arange(1,60001,1),np.ones(784))
# Now let's change the first "image"
X[0] = np.arange(0,784,1)
Y = X.reshape(1200, 50, 28, 28)

我们希望Y中的第一个图像是28x28阵列,其中第一行是0-27,第二行是28-55,依此类推。这就是我们得到的,所以不需要转置。

Y[0][0] = [[1,2,...,27],
           [28,29,...,55],
           ...
           [756,757,...,783]]

注意:这是假设图像逐行展平,即

1 2 3
4 5 6   =>  1 2 3 4 5 6 7 8 9
7 8 9