在NumPy阵列的每个单元处有效地评估函数

Pet*_*ter 123 python performance numpy function vectorization

给定NumPy数组A,将相同函数f应用于每个单元格的最快/最有效的方法是什么?

  1. 假设我们将分配给A(I,J)F(A(I,J)) .

  2. 函数f没有二进制输出,因此掩码(ing)操作无济于事.

"明显的"双循环迭代(通过每个单元格)是最优解吗?

blu*_*lub 163

您可以只是向量化该函数,然后在每次需要时将其直接应用于Numpy数组:

import numpy as np

def f(x):
    return x * x + 3 * x - 2 if x > 0 else x * 5 + 8

f = np.vectorize(f)  # or use a different name if you want to keep the original f

result_array = f(A)  # if A is your Numpy array
Run Code Online (Sandbox Code Playgroud)

在向量化时直接指定显式输出类型可能更好:

f = np.vectorize(f, otypes=[np.float])
Run Code Online (Sandbox Code Playgroud)

  • 请注意`vectorize`函数描述中给出的警告:*vectorize函数主要是为了方便而不是为了提高性能.实现本质上是for循环.*所以这很可能根本不会加速进程. (44认同)
  • 我担心矢量化函数不能比"手动"双循环迭代更快,并且通过所有数组元素进行赋值.特别是,因为它将结果存储到**新创建的变量中(而不是直接存储到初始输入中).非常感谢您的回复:) (18认同)

cyb*_*org 5

类似的问题是:将NumPy数组映射到位.如果你能为你的f()找到一个ufunc,那么你应该使用out参数.