【问题标题】:Building an array from an interpolating function faster in Python在 Python 中更快地从插值函数构建数组
【发布时间】:2022-01-03 20:08:54
【问题描述】:

我有一个使用 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 无法工作。

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

【问题讨论】:

  • 您的 M(n)WE 缺少 np.zeros 参数元组的右括号
  • @matszwecja 已更正
  • “numba 无法工作”是什么意思?它在我的机器上运行良好(Numba v0.45.1)。
  • @Jérôme Richard 在实际程序中,f(x) 是一个使用 interp1d 制作的插值函数,而 numba 不支持这种插值函数,正如我在问题中提到的那样。

标签: python arrays vectorization interpolation numba


【解决方案1】:

我会利用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)

【讨论】:

    【解决方案2】:

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

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

    这样你就可以在循环中简单地做到这一点:

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

    【讨论】:

    • 我认为它实际上不会加速循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    相关资源
    最近更新 更多