2013-08-28 5 views
7

Voglio interpolare un dato nuvola di punti 3D:analogia a scipy.interpolate.griddata?

ho dato un'occhiata al scipy.interpolate.griddata e il risultato è esattamente quello che mi serve, ma se ho capito, ho bisogno di input "gridData", che significa qualcosa come x = [[0,0,0],[1,1,1],[2,2,2]].

Ma il mio dato nuvola di punti 3D non ha questo aspetto della griglia - I valori x, y non si comportano come una griglia - comunque c'è solo un singolo valore z per ogni valore x, y. *

Quindi esiste un'alternativa a scipy.interpolate.griddata per la mia nuvola di punti non in-una-griglia?

* Modifica: "no sguardo grid" significa il mio ingresso è simile al seguente:

x = [0,4,17] 
y = [-7,25,116] 
z = [50,112,47] 
+3

Il nome è fuorviante: 'griddata' prende dati non strutturati, come il tuo, e lo interpola. Immagino che il nome derivi dal fatto che venga tipicamente utilizzato per ricampionare una nuvola di punti in una griglia appropriata. Leggi i [documenti] (http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.griddata.html), l'esempio elaborato è abbastanza rivelatore di come utilizzarlo. Se si interpella più di un singolo insieme di punti, si dovrebbe prendere in considerazione l'uso degli oggetti interpoaltor cui si fa riferimento nei documenti: non si vuole costruire l'interpolatore più di una volta. – Jaime

+0

Oh grazie, ho capito! – Munchkin

+0

Ho una domanda in aggiunta (o dovrei iniziare un nuovo thread per questo?) E 'possibile "tagliare" un certo valore z da questa interpolazione? Significa, voglio inserire un valore z e voglio recuperare un qualche tipo di funzione che descrive il "casing" a quel valore z - o semplicemente mi restituisce l'area all'interno di quel case. – Munchkin

risposta

6

Questa è una funzione che uso per questo genere di cose:

from numpy import linspace, meshgrid 

def grid(x, y, z, resX=100, resY=100): 
    "Convert 3 column data to matplotlib grid" 
    xi = linspace(min(x), max(x), resX) 
    yi = linspace(min(y), max(y), resY) 
    Z = griddata(x, y, z, xi, yi) 
    X, Y = meshgrid(xi, yi) 
    return X, Y, Z 

poi usarlo come this:

X, Y, Z = grid(x, y, z) 
0

Scipy ha documentazione con uno specifico esempio di come utilizzare scipy.interpo late.griddata e spiegano esattamente cosa stai chiedendo. Guardare qui: http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.griddata.html

In breve, si esegue l'operazione get "Dati griglia":

grid_x, grid_y = np.mgrid[0:1:100j, 0:1:200j] 

Ciò farebbe una griglia 100x200 che va da 0 a 1 in entrambi xey direzione .

grid_x, grid_y = np.mgrid[-10:10:51j, 0:2:20j] 

Ciò farebbe una griglia 51x20 che varia da -10 a 10 nella direzione x e da 0 a 2 nella direzione y.

Ora è necessario correggere l'input per scipy.interpolate.griddata.