在 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)
我有一个使用 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)