2017-09-17 1 views
1

J'ai un ensemble de données data[xi,yi,zi] Je voudrais tracer (avec des valeurs d'interpolation). Avec scipy.interpolate, tout semble presque parfait mais l'interpolation génère des valeurs au-delà des limites des données d'entrée. par exemple, supposons que zi soit lié par 0 < zi < 1, l'interpolation de rbf semble renvoyer des valeurs interpolées hors des limites (par exemple >1); ici ma tentative simplifiée:scipy interpolate donne une valeur non bornée

N=100 
data=[xi yi zi] 
xis = np.linspace(xi.min(), xi.max(), N) 
yis = np.linspace(yi.min(), yi.max(), N) 
XI, YI = np.meshgrid(xis,yis) 
rbf = scipy.interpolate.Rbf(xi, yi, zi, function='linear') 
ZI=rbf(XI,YI) 
print ZI.max() 
->1.01357328514 

est-il un moyen de passer à des limites Rbf et laissez-le savoir de ne pas passer devant zi.max() et zi.min()?

+2

Pouvez-vous inclure un exemple reproductible? 'data = [xi yi zi]' n'aide pas – FTP

+0

Désolé je suis allé au lit après avoir posté. Votre solution ci-dessous fonctionne bien @Michelle, merci. – StarStrides

Répondre

1

L'interpolation avec des fonctions de base radiales peut entraîner des valeurs supérieures au maximum et inférieures au minimum des valeurs de données données. (Illustration). C'est une caractéristique mathématique de la méthode, on ne peut pas passer dans une option pour le désactiver. Deux solutions possibles:

  • d'utiliser np.clip pour couper l'interpolant entre les valeurs min-max des données, lors du tracé.
  • utilise une interpolation linéaire par morceaux (scipy.interpolate.LinearNDInterpolator), qui garantit le respect des valeurs de données minimales et maximales.