gpt4 book ai didi

python - scipy.interp2d 警告和网格外的大错误

转载 作者:太空狗 更新时间:2023-10-30 01:28:07 24 4
gpt4 key购买 nike

我正在尝试对一个二​​维函数进行插值,但我遇到了我认为 scipy.interpolate.interp2d 的奇怪行为。我不明白问题出在哪里,很乐意提供任何帮助或提示。

import numpy as np
from scipy.interpolate import interp2d

x = np.arange(10)
y = np.arange(20)
xx, yy = np.meshgrid(x, y, indexing = 'ij')
val = xx + yy
f = interp2d(xx, yy, val, kind = 'linear')

当我运行这段代码时,我收到以下警告:

scipy/interpolate/fitpack.py:981: RuntimeWarning: No more knots can be added because the number of B-spline coefficients already exceeds the number of data points m. Probable causes: either s or m too small. (fp>s) kx,ky=1,1 nx,ny=18,15 m=200 fp=0.000000 s=0.000000
warnings.warn(RuntimeWarning(_iermess2[ierm][0] + _mess))

我不明白为什么 interp2d 在我告诉它应该进行线性插值时会使用任何样条曲线。当我继续并在网格上评估 f 时,一切都很好:

>>> f(1,1)
array([ 2.])

当我在网格外评估它时,我会得到很大的错误,即使函数显然是线性的。

>>> f(1.1,1)
array([ 2.44361975])

我有点困惑,我不确定问题出在哪里。有人遇到过类似的问题吗?我以前用 matlab 工作,这几乎是我在那里做的 1:1,但也许我做错了什么。

当我使用矩形网格(即 y = np.arange(10))时,一切正常,但这不是我需要的。当我使用三次而不是线性插值时,误差会变小(这也没有多大意义,因为函数是线性的)但仍然大得令人无法接受。

最佳答案

我尝试了几件事,并设法使用 scipy.LinearNDInterpolator 获得(某种程度上)我想要的东西。但是,我必须将网格转换为点和值列表。由于我的程序的其余部分以网格格式存储坐标和值,这有点烦人,所以如果可能的话,我仍然希望原始代码能够正常工作。

import numpy as np
import itertools
from scipy.interpolate import LinearNDInterpolator

x = np.arange(10)
y = np.arange(20)
coords = list(itertools.product(x,y))
val = [sum(c) for c in coords]
f = LinearNDInterpolator(coords, val)

>>>f(1,1)
array(2.0)

>>> f(1.1,1)
array(2.1)

关于python - scipy.interp2d 警告和网格外的大错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34583784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com