Python 如何映射numpy数据集?

Python 如何映射numpy数据集?,python,numpy,Python,Numpy,我正在使用和提供的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 = la

我正在使用和提供的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])
但是我不确定第二个
参数究竟起作用了

我也尝试过:

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

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

这个
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)
但申请的目的是什么?只是为了找到一组子矩阵的形状

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

要删除第二个维度,请仅获取最后2个维度的形状

沿_轴应用_
,在最后3维上迭代,将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]]]])

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

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)
但申请的目的是什么?只是为了找到一组子矩阵的形状

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

要删除第二个维度,请仅获取最后2个维度的形状

沿_轴应用_
,在最后3维上迭代,将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]]]])

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

使用
np无法获得性能。沿轴应用
np。矢量化
,等等。只需使用循环:

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)

使用
np.沿_轴应用_
np.矢量化
,等等,不会获得任何性能。只需使用一个循环:

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)

return print expr
返回
None
。我只想测试维度,所以
lambda
基本上是无用的。至于
1
维度,我遵循的教程说,这是神经网络所需要的:
\uu
按照惯例是用来忽略变量的。我试图给出一个可验证的最小示例。就目前情况而言,apply_over call只是为了证明我的问题。最后,我想对60000个图像中的每一个应用一个函数。但目前,
f
不打印
(1,28,28)
矩阵,而是打印
(60000,)
矩阵。但是我想对每个
(1,28,28)
矩阵应用一个函数。然后在第一维上循环:
[f(x)for x in x]
。但是在
应用
中,通过[2,3]`大小写传递给函数的两个变量是什么?我以为它们是轴,所以我会传递
[2,3]
来获得28 x 28图像,但似乎我对numpy数组的工作原理有很大的误解…
returnprint expr
returns
None
。我只想测试维度,所以
lambda
基本上是无用的。至于
1
维度,我遵循的教程说,这是神经网络所需要的:
\uu
按照惯例是用来忽略变量的。我试图给出一个可验证的最小示例。就目前情况而言,apply_over call只是为了证明我的问题。最后,我想对60000个图像中的每一个应用一个函数。但目前,
f
不打印
(1,28,28)
矩阵,而是打印
(60000,)
矩阵。但是我想对每个
(1,28,28)
矩阵应用一个函数。然后在第一维上循环:
[f(x)for x in x]
。但是在
应用
中,通过[2,3]`大小写传递给函数的两个变量是什么?我以为它们是轴,所以我会传递
[2,3]
来获得28 x 28图像,但我似乎对numpy阵列的工作原理有很大的误解…啊,好的。这个符号更有意义!谢谢啊,好的。这个符号更有意义!谢谢