Comment effectuer l'interpolation bilinéaire en Python
Je voudrais effectuer blinear interpolation à l'aide de python.
Exemple gps point pour lequel je tiens à interpoler la hauteur est de:
B = 54.4786674627
L = 17.0470721369
à l'aide de quatre points adjacents avec des coordonnées connues et les valeurs de hauteur:
n = [(54.5, 17.041667, 31.993), (54.5, 17.083333, 31.911), (54.458333, 17.041667, 31.945), (54.458333, 17.083333, 31.866)]
z01 z11
z
z00 z10
et voici mon essai primitif:
import math
z00 = n[0][2]
z01 = n[1][2]
z10 = n[2][2]
z11 = n[3][2]
c = 0.016667 #grid spacing
x0 = 56 #latitude of origin of grid
y0 = 13 #longitude of origin of grid
i = math.floor((L-y0)/c)
j = math.floor((B-x0)/c)
t = (B - x0)/c - j
z0 = (1-t)*z00 + t*z10
z1 = (1-t)*z01 + t*z11
s = (L-y0)/c - i
z = (1-s)*z0 + s*z1
où z0 et z1
z01 z0 z11
z
z00 z1 z10
Je reçois 31.964 mais d'autres logiciels, je reçois 31.961.
Est mon script correct?
Pouvez-Vous fournir une autre approche?
Vous avez des erreurs d'arrondi et vous êtes arrondi??? Qu'advient-il si vous supprimez
Ce sont L et B? Les coordonnées du point à partir duquel vous souhaitez interpoler?
la nostalgie c'est vrai
Une note de latitude et de longitude ne sont pas coordonnées planaires, de sorte que ce résultat ne sera pas vous obtenir ce que vous voulez si vous avez affaire à de grandes distances.
floor
?Ce sont L et B? Les coordonnées du point à partir duquel vous souhaitez interpoler?
la nostalgie c'est vrai
Une note de latitude et de longitude ne sont pas coordonnées planaires, de sorte que ce résultat ne sera pas vous obtenir ce que vous voulez si vous avez affaire à de grandes distances.
OriginalL'auteur daikini | 2011-12-28
Vous devez vous connecter pour publier un commentaire.
Voici une réutilisables fonction que vous pouvez utiliser. Il comprend des doctests et de validation des données:
Vous pouvez exécuter le test de code en ajoutant:
De l'exécution de l'interpolation sur votre jeu de données produit:
+1 pour le génie logiciel.
Hettinger Merci beaucoup pour cette réponse. Pourquoi ne pas
scipy.interpolate.interp2d
de travail dans ce cas? N'est-ce pas leinterp2d
également une interpolation bilinéaire, car il "une Interpolation sur une grille 2-D" (source: docs.scipy.org/doc/scipy-0.14.0/reference/generated/...) ?Autant que je sache, c'est la méthode d'interpolation bilinéaire lorsque vous utilisez
kind=linear
. Empiriquement, j'ai aussi comparé les résultats entre cette réponse etinterp2d
aveckind=linear
-- ils sont exactement les mêmes.OriginalL'auteur Raymond Hettinger
Ne sais pas si cela aide beaucoup, mais j'obtiens une valeur différente lors de l'interpolation linéaire en utilisant scipy:
griddata
interpole linéairement dans un simplex (triangle) plutôt que de bilinearly dans un rectangle; cela signifie qu'il est en train de faire de la triangulation (Delaunay?) d'abord.OriginalL'auteur jterrace
Vous pouvez également vous reporter à la interp fonction dans matplotlib.
OriginalL'auteur dgorissen
Inspiré de ici, je suis venu avec l'extrait de code suivant. L'API est optimisé pour la réutilisation d'un grand nombre de fois la même table:
Vous pouvez l'utiliser comme ceci:
Cette version n'a pas de contrôle d'erreur et vous serez confronté à des problèmes si vous essayez de l'utiliser à la limite de l'index (ou au-delà). Pour la version complète du code, y compris la vérification des erreurs et en option de l'extrapolation, regardez ici.
OriginalL'auteur pmav99
Je pense que le point de faire une
floor
fonction, c'est que généralement vous êtes à la recherche d'interpoler une valeur dont les coordonnées se trouve entre deux discrète coordonnées. Cependant vous semblez avoir les vrai valeurs des coordonnées des points les plus proches, ce qui rend mathématiques simples.Il pourrait y avoir un peu de logique erronée dans la traduction de votre exemple, mais l'essentiel, c'est que vous pouvez le poids de chaque point de base sur la façon de beaucoup plus près, il est à l'interpolation but que de ses autres voisins.
left
,right
etz
pardy1+dy2
,dy1+dy2
etdx1+dx2
respectueusement?Je ne suis pas sûr de savoir pourquoi vous ferais ça.
dx1
,dx2
,dy1
, etdy2
sont tous normalisés supplémentaire des valeurs entre 0 et 1 (dy1+dy2
est toujours égal à 1) depuis dx est la distance totale entre le voisin et le voisin de droite, et de même pour dy.Oh, désolé. Ils sont déjà normalisées.
la nostalgie, je ne sais pas si c'est clair que le but est d'interpoler la valeur de la hauteur pour un point donné, ce qui est d'environ 31 mètres selon les hauteurs de points adjacents 31.993, 31.911, 31.945, 31.866.
aspiration Merci pour Votre réponse.
OriginalL'auteur machine yearning