interpoler le volume 3D avec numpy et ou scipy
Je suis extrêmement frustré parce que, après plusieurs heures, je n'arrive pas à être en mesure de faire un semblant de 3D facile d'interpolation en python. Dans Matlab tout ce que j'avais à faire était de
Vi = interp3(x,y,z,V,xi,yi,zi)
Ce qui est l'équivalent exact de cette aide scipy est ndimage.map_coordinate ou d'autres numpy méthodes?
Grâce
source d'informationauteur user1301295 | 2014-02-17
Vous devez vous connecter pour publier un commentaire.
Dans scipy 0.14 ou tard, il y est une nouvelle fonction
scipy.interpoler.RegularGridInterpolator
qui ressemble étroitement àinterp3
.L'MATLAB commande
Vi = interp3(x,y,z,V,xi,yi,zi)
serait traduit en quelque chose comme:Voici un exemple complet démontrant à la fois; il va vous aider à comprendre les différences exactes...
CODE MATLAB:
Le résultat est
Vi=[268 357]
qui est en effet la valeur de ces deux points(2,6,8)
et(3,5,7)
.SCIPY CODE:
De nouveau, c'est
[268,357]
. Donc, vous voyez quelques différences: Scipy utilise x,y,z ordre d'index alors que MATLAB utilise y,x,z (étrangement); Dans Scipy vous de définir une fonction dans une étape distincte et quand vous l'appelez, les coordonnées sont regroupés comme (x1,y1,z1),(x2,y2,z2),... alors que matlab utilise (x1,x2,...),(y1,y2,...),(z1,z2,...).Autre que cela, les deux sont similaires et tout aussi facile à utiliser.
Fondamentalement,
ndimage.map_coordinates
fonctionne en "index" de coordonnées (un.k.un. "voxel" ou "pixel" coordonnées). L'interface semble un peu maladroit au début, mais il ne vous donner un beaucoup de flexibilité.Si vous souhaitez spécifier l'interpolation des coordonnées similaire à matlab
interp3
alors vous aurez besoin de convertir vos entrées coordonnées dans "index" coordonnées.Il y a aussi les rides que
map_coordinates
conserve toujours la dtype du tableau d'entrée à la sortie. Si vous interpoler un tableau d'entiers, vous obtiendrez un nombre entier de sortie, qui peut ou peut ne pas être ce que vous voulez. Pour l'extrait de code ci-dessous, je vais supposer que vous en voulez toujours flottant point de sortie. (Si vous n'en avez pas, c'est effectivement plus simple.)Je vais essayer d'ajouter plus d'explications plus tard ce soir (ce qui est assez dense code).
Dans l'ensemble, le
interp3
fonction de ce que j'ai est plus complexe qu'il faudra peut-être pour exactement à vos fins. Howver, il devrait plus ou moins reproduire le comportement deinterp3
que je m'en souviens (en ignorant le "zoom" de la fonctionnalité deinterp3(data, zoom_factor)
quiscipy.ndimage.zoom
poignées.)La exacte équivalent à MATLAB
interp3
serait à l'aide de scipy estinterpn
pour un hors d'interpolation:La méthode par défaut pour les deux MATLAB et scipy est l'interpolation linéaire, et cela peut être modifié avec la
method
argument. Notez que seulement linéaire et le plus proche voisin de l'interpolation est pris en charge parinterpn
pour les 3 dimensions et au-dessus, à la différence de MATLAB qui prend en charge cubes et interpolation spline.Lors de la prise de plusieurs interpolation des appels sur la même grille, il est préférable d'utiliser l'interpolation objet
RegularGridInterpolator
comme dans la accepté de répondre à ci-dessus.interpn
utiliseRegularGridInterpolator
en interne.