Python/Scipy Interpolation (map_coordinates)

Je suis en train de faire quelques interpolation avec scipy. Je suis passé par de nombreux exemples, mais je ne suis pas à trouver exactement ce que je veux.

Disons que j'ai des données où la ligne et la colonne de la variable peut varier de 0 à 1. Le delta changements entre chaque ligne et chaque colonne n'est pas toujours la même (voir ci-dessous).

      | 0.00   0.25  0.80  1.00
------ | ----------------------------
0.00  | 1.40   6.50  1.50  1.80
0.60  | 8.90   7.30  1.10  1.09
1.00  | 4.50   9.20  1.80  1.20

Maintenant, je veux être en mesure de prendre un ensemble de x,y des points et déterminer les valeurs interpolées. Je sais que je peux le faire avec map_coordinates. Je me demandais si il n'y est aucun facile/moyen astucieux de faire un x,un y la valeur de l'indice approprié dans le tableau de données.

Par exemple, si je entrée x,y = 0.60, 0.25, alors que je devrais obtenir le retour à l'index correct pour être interpolées. Dans ce cas, ce serait 1.0, 1.0 depuis 0.60, 0.25 serait carte exactement à la deuxième ligne de la deuxième colonne. x=0.3 serait carte à 0,5 puisqu'il est à mi-chemin entre 0,00 et 0,60.

Je sais comment obtenir le résultat que je veux, mais je suis certain qu'il est très rapide/effacer une ou deux lignes (ou une fonction qui existe déjà) qui peuvent le faire pour rendre mon code plus clair. Fondamentalement, il doit par morceaux interpoler entre certains de tableau.

Voici un exemple (fortement basée sur le code de Scipy interpolation sur un tableau numpy) - j'ai mis TODO où cette nouvelle fonction:

from scipy.ndimage import map_coordinates
from numpy import arange
import numpy as np
#            0.000,  0.175,  0.817,  1.000
z = array([ [ 3.6,    6.5,    9.1,    11.5],    # 0.0000
[ 3.9,   -7.3,    10.0,   13.1],    # 0.2620
[ 1.9,    8.3,   -15.0,  -12.1],    # 0.6121
[-4.5,    9.2,    12.2,   14.8] ])  # 1.0000
ny, nx = z.shape
xmin, xmax = 0., 1.
ymin, ymax = 0., 1.
xrange = array([0.000,  0.175,  0.817,  1.000 ])
yrange = array([0.0000, 0.2620, 0.6121, 1.0000])
# Points we want to interpolate at
x1, y1 = 0.20, 0.45
x2, y2 = 0.30, 0.85
x3, y3 = 0.95, 1.00
# To make our lives easier down the road, let's
# turn these into arrays of x & y coords
xi = np.array([x1, x2, x3], dtype=np.float)
yi = np.array([y1, y2, y3], dtype=np.float)
# Now, we'll set points outside the boundaries to lie along an edge
xi[xi > xmax] = xmax
xi[xi < xmin] = xmin
yi[yi > ymax] = ymax
yi[yi < ymin] = ymin
# We need to convert these to (float) indicies
#   (xi should range from 0 to (nx - 1), etc)
xi = (nx - 1) * (xi - xmin) / (xmax - xmin)
yi = (ny - 1) * (yi - ymin) / (ymax - ymin)
# TODO: Instead, xi and yi need to be mapped as described.  This can only work with
# even spacing...something like:
#xi = SomeInterpFunction(xi, xrange)
#yi = SomeInterpFunction(yi, yrange)
# Now we actually interpolate
# map_coordinates does cubic interpolation by default,
# use "order=1" to preform bilinear interpolation instead...
print xi
print yi
z1, z2, z3 = map_coordinates(z, [yi, xi], order=1)
# Display the results
for X, Y, Z in zip((x1, x2, x3), (y1, y2, y3), (z1, z2, z3)):
print X, ',', Y, '-->', Z

OriginalL'auteur Scott B | 2011-02-26