python的interp 2D问题

计算科学 Python 插值 scipy 麻木的
2021-12-20 10:57:10

我正在编写一些函数来插入数据。在使用 interp2D 时,以某种方式,示例矩阵可以工作,但是当我更改矩阵的大小时,它会返回错误。

#!/usr/bin/python3

# 
# Useful interpolation functions in python.
# 

import numpy as np
import scipy.interpolate

def interp_2d(x,y,fxy,x_desired,y_desired):

    interp_func = scipy.interpolate.interp2d(x, y, fxy, kind='cubic')

    return interp_func(x_desired,y_desired)

#
# Main function.
#

def main():

    x   =  np.array([0.0,1.0,2.0,3.0])
    y   =  np.array([0.0,1.0,2.0,3.0])
    fxy =  np.array([[50.0,60.0,70.0,80.0],
                     [50.0,60.0,70.0,80.0],
                     [50.0,60.0,70.0,80.0],
                     [50.0,60.0,70.0,80.0]])

    # With the current definition of x,y and fxy works.

    x_desired = 1.0
    y_desired = 1.0

    print(interp_2d(x,y,fxy,x_desired,y_desired)[0]) # returns 60.0, ok !

    # With this definition, it crashes.

    x   =  np.array([0.0,1.0])
    y   =  np.array([0.0,1.0])
    fxy =  np.array([[50.0,60.0],[50.0,60.0]])

    x_desired = 1.0
    y_desired = 1.0

    print(interp_2d(x,y,fxy,x_desired,y_desired)[0]) # Crashes, should be 60 as well.


if __name__== "__main__":
    main()

它仍然是一个方阵,但是,它不能正确处理问题。

The error it returns is:
Traceback (most recent call last):
  File "./interp_ask.py", line 49, in <module>
    main()
  File "./interp_ask.py", line 45, in main
    print(interp_2d(x,y,fxy,x_desired,y_desired)[0]) # Crashes
  File "./interp_ask.py", line 12, in interp_2d
    interp_func = scipy.interpolate.interp2d(x, y, fxy, kind='cubic')
  File "/usr/lib/python3.7/site-packages/scipy/interpolate/interpolate.py", line 249, in __init__
    kx=kx, ky=ky, s=0.0)
dfitpack.error: (mx>kx) failed for hidden mx: regrid_smth:mx=2

谢谢你们 !

1个回答

根据文档,矩阵中的最小数据点数应该是(k+1)2, 在哪里k=1,k=3k=5分别用于线性、三次和五次插值。实际上,在您的代码中更改kind='cubic'kind='linear'可以消除错误。

您可能希望在函数开头检查矩阵的大小interp_2d以更改插值类型和/或在矩阵大小太小时时返回错误。