在每个NumPy数组单元格中高效评估函数

128 投票
6 回答
121825 浏览
提问于 2025-04-17 03:57

给定一个NumPy数组A,有没有什么快速又高效的方法可以对每一个单元格应用相同的函数f()

我通过f(A(i,j))来给A(i,j)赋值。函数f()没有二进制输出,所以用掩码操作是没用的。那是不是通过双重循环遍历每个单元格是最优的解决方案呢?

6 个回答

1

如果你在处理数字,并且有一个条件是 f(A(i,j)) = f(A(j,i)),那么你可以使用 scipy.spatial.distance.cdist 这个工具,把 f 定义为 A(i)A(j) 之间的距离。

6

有一个类似的问题是:在原地映射一个NumPy数组。如果你能找到一个适合你函数f()的ufunc,那么你应该使用out参数。

164

你可以直接把这个函数“向量化”,然后每次需要的时候就可以直接应用到一个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

在进行向量化的时候,最好直接指定一个明确的输出类型:

f = np.vectorize(f, otypes=[np.float])

撰写回答