2014-04-11 11 views
9

Perché la chiamata in basso a griddata fallisce?Scipy - 3d griddata - Perché è necessario il cast di griddata xi per la tupla?

import scipy.interpolate 
import numpy as np 
grid_vals = np.meshgrid(*([np.linspace(-1,1,200)] * 3)) 
interp_vals = scipy.interpolate.griddata(np.random.randn(50,3), np.random.randn(50), grid_vals, 'linear') 

La seguente eccezione si verifica: ValueError: numero di dimensioni in xi non corrisponde x

Se lancio l'argomento xi (grid_vals) a tupla:

interp_vals = scipy.interpolate.griddata(np.random.randn(50,3), np.random.randn(50), tuple(grid_vals), 'linear') 

L'errore va lontano. Perché?

risposta

3

La base per questo è che griddata passa sia points e xi attraverso una funzione points = _ndim_coords_from_arrays(points) la cui documentazione si legge:

Convert a tuple of coordinate arrays to a (..., ndim)-shaped array. 

e tasto azione sul tuple è:

p = np.broadcast_arrays(*points) 

qualsiasi altra cosa, compreso un elenco , è appena convertito in un array:

points = np.asanyarray(points) 

L'interpolazione effettiva prevede l'ultimo array con dimensione "3d".

Quindi l'elenco di 3 array (200,200,200) diventa un array di (3,200,200,200) forma. Ma l'array points è (50,3). I risultati del messaggio number of dimensions in xi does not match x da 200 non corrispondono a 3.

La documentazione griddata è chiara su points, meno per xi. Ma il suo esempio utilizza (x, Y) utilizzando gli array da mgrid.

Quindi questo dovrebbe funzionare:

X, Y, Z = np.meshgrid(*([np.linspace(-1,1,200)] * 3)) 
interp_vals = scipy.interpolate.griddata(points, values, (X,Y,Z), 'linear') 

Un altro modo di generare la matrice richiesta dalla lista meshgrid è quello di rendere un array, e girare la prima dimensione

grid_vals = np.rollaxis(np.array(grid_vals),0,4) 

Un altro modo di generare una mesh è , che restituisce una mesh aperta sotto forma di tupla. Una rete aperta come questa ha bisogno della trasmissione.

Un unico punto sarebbe stato interpolato con entrambi:

interpolate.griddata(points,values,[[[[0,0,0]]]],'linear') 
interpolate.griddata(points,values,([0],[0],[0]),'linear') 

vedere la reazione alla richiesta di pull 4123 John ha più discussione sui perché.

Problemi correlati