scipy.interp2d警告和不同于预期的结果

时间:2016-01-15 22:01:08

标签: python scipy linear-interpolation

我正在尝试将MATLAB代码转换为等效的python。 我有3个数组,我想计算nuA = np.asarray([2.439,2.5,2.6,2.7,2.8,3.0,3.2,3.5,4.0,5.0,6.0,8.0,10,15,25]) nuB = np.asarray([0,0.1,0.2,0.3,0.5,0.7,1]) a, b = np.meshgrid(nuA, nuB) betaTab = np.transpose(np.asarray([[0.0,2.16,1.0,1.0,1.0,1.0,1.0],[0.0,1.592,3.39,1.0,1.0,1.0,1.0],[0.0,0.759,1.8,1.0,1.0,1.0,1.0],[0.0,0.482,1.048,1.694,1.0,1.0,1.0],[0.0,0.36,0.76,1.232,2.229,1.0,1.0],[0.0,0.253,0.518,0.823,1.575,1.0,1.0],[0.0,0.203,0.41,0.632,1.244,1.906,1.0],[0.0,0.165,0.332,0.499,0.943,1.56,1.0],[0.0,0.136,0.271,0.404,0.689,1.23,2.195],[0.0,0.109,0.216,0.323,0.539,0.827,1.917],[0.0,0.096,0.19,0.284,0.472,0.693,1.759],[0.0,0.082,0.163,0.243,0.412,0.601,1.596],[0.0,0.074,0.147,0.22,0.377,0.546,1.482],[0.0,0.064,0.128,0.191,0.33,0.478,1.362],[0.0,0.056,0.112,0.167,0.285,0.428,1.274]])) ip = scipy.interpolate.interp2d(a,b,betaTab)

/usr/local/lib/python2.7/dist-packages/scipy/interpolate/fitpack.py:981: RuntimeWarning: No more knots can be added because the additional knot would
coincide with an old one. Probable cause: s too small or too large
a weight to an inaccurate data point. (fp>s)
    kx,ky=1,1 nx,ny=4,14 m=105 fp=21.576347 s=0.000000
  warnings.warn(RuntimeWarning(_iermess2[ierm][0] + _mess))

当我尝试运行它时,会显示以下警告:

interp2d

我知道matlab interp2RectBivariateSpline不同,而python ip(xi,yi)函数是首选。但由于我的数据长度,我无法使用后一种功能。此外,interp2d的最终结果与MATLAB答案不同。

如何在没有警告的情况下计算{{1}}并正确计算?

1 个答案:

答案 0 :(得分:2)

您的输入数据似乎非常不明确。这是输入点的表面图:

plot of input data, quite ugly

插值不是一个简单的问题。顺便说一句,我recently ran into problems interp2d其中scipy.interpolate.griddata甚至无法插入平滑的数据集。所以我建议您查看import numpy as np import scipy.interpolate as interp import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D #define your data as you did in your question: a, b and betaTab ip = interp.interp2d(a,b,betaTab) # original interpolator aplotv = np.linspace(a.min(),a.max(),100) # to interpolate at bplotv = np.linspace(b.min(),b.max(),100) # to interpolate at aplot,bplot = np.meshgrid(aplotv,bplotv) # mesh to interpolate at # actual values from interp2d: betainterp2d = ip(aplotv,bplotv) # actual values from griddata: betagriddata = interp.griddata(np.array([a.ravel(),b.ravel()]).T,betaTab.ravel(),np.array([aplot.ravel(),bplot.ravel()]).T) # ^ this probably could be written in a less messy way, # I'll keep thinking about it #plot results fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.plot_surface(aplot,bplot,betainterp2d,cmap='viridis',cstride=1,rstride=1) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.plot_surface(aplot,bplot,betagriddata,cmap='viridis',cstride=1,rstride=1)

interp2d

结果:(左:griddata,右:scipy.interpolate.griddata

result interp2d'd result griddata'd

结论:使用Array.prototype.concatAll = function() { var results = []; this.forEach(function(subArray) { subArray.forEach(function(element) { results.push(element); }); }); return results; }; // [ [1,2,3], [4,5,6], [7,8,9] ] -> [1, 2, 3, 4, 5, 6, 7, 8, 9]