我正在使用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)
。我如何获得每个子图像?
答案 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_axis
,np.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)