我看到很多问题要求以更快的方式迭代 2d 数组的每个元素,但我还没有找到迭代 3d 数组以便在每个 2d 数组上应用函数的好方法.例如:
from scipy.fftpack import dct
X = np.arange(10000, dtype=np.float32).reshape(-1,4,4)
np.array(map(dct, X))
在这里,我将遍历维度为 (625,4,4)
的 3d 数组中包含的每个 2d 数组。并对每个 4X4
应用 DCT(离散余弦变换)大批。我想知道是否有更合适的方法来实现这一点。
谢谢
最佳答案
Numpy 函数:
在这种情况下,由于 dct
是一个 numpy
函数,它具有将其应用于特定轴的内置功能。几乎所有 numpy 函数都在完整数组上运行,或者可以被告知在特定轴(行或列)上运行。
因此,只需利用 dct
函数的 axis
参数:
dct( X, axis=2)
你会得到一个等价的结果:
>>> ( dct(X, axis=2) == np.array(map(dct, X)) ).all()
True
在我们的 (625,4,4)
矩阵中,这也比使用 map
函数快 >35 倍:
%timeit dct(X, axis=2)
1000 loops, best of 3: 157 µs per loop
%timeit np.array(map(dct, X))
100 loops, best of 3: 5.76 ms per loop
通用 Python 函数:
在其他情况下,您可以使用 np.vectorize 来向量化
python 函数或 np.frompyfunc功能。例如,如果您有一个执行标量运算的演示函数:
def foo(x): # gives an error if passed in an array
return x**2
>>> X = np.arange(8, dtype=np.float32).reshape(-1,2,2)
>>> foo_arr = np.vectorize( foo)
>>> foo_arr(X)
array([[[ 0., 1.],
[ 4., 9.]],
[[ 16., 25.],
[ 36., 49.]]])
讨论 here也可能对你有帮助。正如他们所说,对非 numpy 函数进行矢量化实际上并不能使其更快。
关于python - 在 Python 中迭代包含在 3d 数组中的 2d 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27627792/