python - scipy.interp2d warning and different result than expected -


i'm trying convert matlab code equivalent python. have 3 arrays , want compute interp2d:

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) 

when try run it, warning displayed:

/usr/local/lib/python2.7/dist-packages/scipy/interpolate/fitpack.py:981: runtimewarning: no more knots can added because additional knot coincide old one. probable cause: s small or large weight 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)) 

i know interp2d different matlab interp2 , in python rectbivariatespline function preferred. can't use latter function because of length of data. also, final result of ip(xi,yi) different matlab answer.

how can compute interp2d without warning , compute correctly?

your input data seems quite ill-defined. here's surface plot of input points:

plot of input data, quite ugly

this not easy problem interpolate. incidentally, i've recently ran problems interp2d couldn't interpolate smooth data set. suggest checking out scipy.interpolate.griddata instead:

import numpy np import scipy.interpolate interp import matplotlib.pyplot plt mpl_toolkits.mplot3d import axes3d  #define data did in question: a, b , betatab  ip = interp.interp2d(a,b,betatab)           # original interpolator  aplotv = np.linspace(a.min(),a.max(),100)   # interpolate @ bplotv = np.linspace(b.min(),b.max(),100)   # interpolate @ aplot,bplot = np.meshgrid(aplotv,bplotv)    # mesh interpolate @  # actual values interp2d: betainterp2d = ip(aplotv,bplotv)  # actual values griddata: betagriddata = interp.griddata(np.array([a.ravel(),b.ravel()]).t,betatab.ravel(),np.array([aplot.ravel(),bplot.ravel()]).t) # ^ written in less messy way, # i'll keep thinking  #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) 

results: (left: interp2d, right: griddata)

result interp2d'd result griddata'd

conclusion: use scipy.interpolate.griddata.


Comments

Popular posts from this blog

get url and add instance to a model with prefilled foreign key :django admin -

css - Make div keyboard-scrollable in jQuery Mobile? -

ruby on rails - Seeing duplicate requests handled with Unicorn -