繁体   English   中英

在Python中迭代3d数组中包含的2d数组

[英]Iterating over 2d arrays contained in 3d array in Python

我已经看到很多问题要求以更快的方式迭代2d数组的每个元素,但是我没有找到一个很好的方法迭代3d数组以便在每个2d数组上应用函数。 例如:

from scipy.fftpack import dct
X = np.arange(10000, dtype=np.float32).reshape(-1,4,4)
np.array(map(dct, X))

在这里,我将浏览包含在3d维数组(625,4,4)中的每个2d数组, (625,4,4)每个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.vectorizenp.frompyfunc函数对python函数进行vectorize 例如,如果您有一个执行标量操作的演示函数:

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

这里的讨论也可能对您有所帮助。 正如他们所说,矢量化非numpy函数实际上并没有使它更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM