2017-03-16 62 views
0

我正在与Keras和提供的MNIST数据集一起工作。我相信数据集是一个numpy数组。我有如下重塑它:如何映射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×28图像。我想提取每一个28×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)。我如何获得每个子图像?

回答

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) 
+0

啊,好的。这个符号更有意义!谢谢! – Dair

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]] 

以去除第二尺寸,获得的最后2

apply_along_axis只是形状,在最后3暗淡迭代,传递一维数组的拉姆达。所以实际上它返回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]]]]) 

通常这样的迭代是不需要的。使用时,与“全数组”相比较慢。

+0

'返回打印expr'返回'None'。我试图测试的是维度,所以'lambda'基本上是无用的。至于'1'尺寸,我跟着的教程说这是神经网络所需要的:https://elitedatascience.com/keras-tutorial-deep-learning-in-python '_'按惯例是用来做什么的忽略变量。 – Dair

+0

我想给一个最小的可验证的例子。就目前而言,apply_over电话只是为了证明我的问题。最终,我想对60000个图像中的每一个应用一个功能。但是目前'f'不打印'(1,28,28)'矩阵,它会打印'(60000)'矩阵。但是我想对每个'(1,28,28)'矩阵应用一个函数。 – Dair

+1

然后只是在第一维上循环:'[f(x)for x in X]''。 – hpaulj