【问题标题】:Scipy interpolate 2d error m >= (kx+1)(ky+1) must holdScipy interpolate 2d error m >= (kx+1)(ky+1) 必须成立
【发布时间】:2019-08-26 16:17:49
【问题描述】:

我想使用 Scipy interpolate2d 选项来预测“训练”点之外的点中的值。我有 value=f(b_1,b_2) 函数,我想对其进行近似/插值。 matplotlib 能够使用给定的数据进行插值并绘制它。

我尝试使用scipy.interpolate.interp2d,但没有成功,执行时出现错误

raise TypeError('m >= (kx+1)(ky+1) must hold')
TypeError: m >= (kx+1)(ky+1) must hold

这里是代码:

from scipy import interpolate
import scipy
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt 

calibration = {'b_1_probe1':    [-2,1.0,2.0,-2.0,1.5,0.0,1.0,2.0,2.0,-2.0,-0.8,-0.6],
'b_2_probe1':                  [-2,-2.0,0.4,2,1.0,0.0,2.0,2.0,-2.0,0.0,0.6,-0.7],
'value':            [5.0,6.0,3.0,4.0,-2.0,3.0,5.0,-3.0,-4.0,1.0,-2.0,3.0],
'value_A_t':            [2.0,3.0,4.0,5.0,1.0,2.0,3.0,-4.0,-2.0,2.0,-3.0,1.0]}
calibration = pd.DataFrame(calibration,columns= ['b_1_probe1','b_2_probe1','value','second_value'])
x = calibration['b_1_probe1']
y = calibration['b_2_probe1']
z = calibration['value']
f, ax = plt.subplots(1,2, sharex=True, sharey=True)
ax[0].tripcolor(x,y,z,shading='gouraud')
ax[1].tricontourf(x,y,z, 20) # choose 20 contour levels, just to show how good its interpolation is
ax[1].plot(x,y, 'ko ')
ax[0].plot(x,y, 'ko ')
plt.xlim(-2, 2)
plt.ylim(-2, 2)
plt.show()

# Interpolation goes here
f=scipy.interpolate.interp2d(x, y, z, kind='cubic', copy=True, bounds_error=False, fill_value=None)

test = {'b_1':    [-1.8,-0.5,0.4,2,1.0,0.0,1.4,0.6,-1.0,0.0,0.6,-0.7],
        'b_2':    [1.8,1.0,2.0,-1.4,1.5,0.0,1.0,2.0,2.0,-2.0,-0.8,-0.6]}
test = pd.DataFrame(test,columns= ['b_1','b_2'])
xnew = test['b_1']
ynew = test['b_2']
znew = f(xnew, ynew)
plt.plot(x, z[0, :], 'ro-', xnew, znew[0, :], 'b-')
plt.show()

我希望 scipy.interpolate 能够从给定数据进行插值并将其显示在绘图中,因此我可以比较插值前后的颜色轮廓。

【问题讨论】:

    标签: python scipy


    【解决方案1】:

    TypeError 不是很清楚,但如果您深入研究插值代码,您会发现 kx = ky = 3 用于 cubic 插值和 m = len(x),因此 m >= (kx+1)(ky+1) 不正确。如果您使用kind='linear',它将起作用(尽管代码中还有一些其他错误)。这在interp2d documentation 中注明。

    【讨论】:

    • 所以解决办法就是加点,或者把kind改成'linear'所以kx=ky=1
    【解决方案2】:

    我使用 scipy.interpolate.LinearNDInterpolator 解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2020-09-16
      • 2020-04-28
      • 2017-12-28
      • 2018-10-21
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      相关资源
      最近更新 更多