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

标签 python numpy multidimensional-array iteration vectorization

我看到很多问题要求以更快的方式迭代 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/

相关文章:

python - 如何以 pythonic 方式管理大量庞大的数组。

python - 列切片和行切片之间哪个是哪个?

multidimensional-array - 将多维内存 View 传递给 c 函数

python - Pandas asof_locs 示例

c++ - 将 C++ 字符串传递给 Python

python - 错误 - TypeError 在 django 中得到了一个意外的关键字参数 'name'

python - Keras 序列模型输入形状

python-3.x - BicGStab 产生意外故障标志

multidimensional-array - 如何在Perl 6中切片形状数组?

jquery - 如何使用jquery获取对象的值数组