如何映射numpy数据集?

时间:2017-03-16 03:27:48

标签: python numpy

我正在使用Keras和提供的MNIST数据集。我相信数据集是一个numpy数组。我把它重新塑造如下:

X_train = X_train.reshape(X_train.shape[0], 1, 28, 28)
X_test = X_test.reshape(X_test.shape[0], 1, 28, 28)

这给出了一个(60000, 1, 28, 28) numpy数组。这可以被读取,因为有60000个28 x 28图像。我想提取每个28 x 28图像并对其应用某种函数f。我尝试过以下方法:

f = lambda a, _: print a.shape
np.apply_over_axes(f, data, [2,3])

但我不确定第二个axis参数是否会发挥作用......

我也尝试过:

f = lambda a: print a.shape
np.apply_along_axis(f, 0, data)

但形状总是(60000,)而不是我期望的(1, 28, 28)。我如何获得每个子图像?

2 个答案:

答案 0 :(得分:1)

lambda没有意义:

lambda a, _: print a.shape

它相当于

def foo(a, x):
   return print a.shape

print a.shape打印一些内容,不返回任何内容,甚至可能是错误。

lambda a,x: a.shape更好,返回a的形状,忽略x参数。

如果尺寸1尺寸阻碍了,为什么不省略呢?

X_train = X_train.reshape(X_train.shape[0], 28, 28)

或将其删除

X_train[:,0,...]
np.squeeze(X_train)

但是apply_over的重点是什么?只是为了找到一组子矩阵的形状?

In [304]: X = np.ones((6,1,2,3))
In [305]: [x.shape for x in X]
Out[305]: [(1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3)]

[x.shape for x in X[:,0]]

删除第二个维度,只获得最后一个维度的形状。

这个apply_along_axis迭代最后3个dim,将1d数组传递给lambda。所以实际上它正在返回X[:,0,i,j].shape

In [308]: np.apply_along_axis(lambda a: a.shape, 0, X)
Out[308]: 
array([[[[6, 6, 6],
         [6, 6, 6]]]])

通常不需要这样的迭代。使用时,与全阵列相比,速度较慢。的。

答案 1 :(得分:1)

使用np.apply_along_axisnp.vectorize等无法获得任何效果。只需使用循环:

import numpy as np

s = (4,1,28,28)
a = np.zeros(s)
for img in a[:,0]:
    print(img.shape)

# (28, 28)
# (28, 28)
# (28, 28)
# (28, 28)