在 Python 中更快地从插值函数构建数组

Building an array from an interpolating function faster in Python

我有一个使用 interp1d 创建的插值函数 f(x)。

现在,我必须根据函数 f(x) 构造一个函数 f(y,z),其中 x=(y-z)/2。

我正在使用嵌套循环来完成它:

f = lambda x: x**3
y = np.arange(0,100)
z = np.arange(0,100)
fnew = np.zeros((100,100))
for i in range(0,100):
    for j in range(0,100):
        fnew[i,j] = f((y[j]-z[i])/2)

为了说明,我采用了函数 f=x^3。但是,由于我为 i 和 j 迭代了约 8000 个值,并且由于 f(x) 是一个插值函数,因此循环花费了很长时间(显然)并且 numba 无法工作。

有没有更好的方法来实现这个?

不确定它如何与 numba 一起工作,但我认为创建新函数的大多数 pythonic 方式是这样的:

g = lambda y, z: f((y-z)/2)

这样你就可以简单地在一个循环中执行此操作:

fnew[i,j] = g(i, j)

我会利用 broadcasting rules:

f = lambda x: x ** 3
y = np.arange(100)
z = np.arange(100)
fnew = f((y[np.newaxis, :] - z[:, np.newaxis]) * 0.5)