2014-04-11 10 views
9

Dlaczego poniższe wywołanie griddata kończy się niepowodzeniem?Scipy - 3d griddata - Dlaczego konieczne jest rzutowanie argumentu griddata xi na krotkę?

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') 

następujący wyjątek występuje: ValueError: liczba wymiarów xi nie pasuje x

Jeśli rzucam XI (grid_vals) argument na krotka:

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

Błąd idzie z dala. Czemu?

Odpowiedz

3

Podstawowym dlaczego jest to, że griddata przenika points i xi przez points = _ndim_coords_from_arrays(points) funkcji, której dokumentacja brzmi:

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

i klucz działanie na krotki jest:

p = np.broadcast_arrays(*points) 

cokolwiek innego, w tym wykaz jest konwertowany na tablicę:

points = np.asanyarray(points) 

Rzeczywista interpolacja oczekuje, że tablice będą miały wymiar "3d" jako ostatni.

Twoja lista macierzy 3 (200,200,200) staje się tablicą o kształcie (3,200,200,200). Ale Twoja tablica points to (50,3). Komunikat o błędzie number of dimensions in xi does not match x jest wynikiem 200 niezgodny z 3.

Dokumentacja griddata jest jasna o points, w mniejszym stopniu dla xi. Ale jego przykład używa (x, Y) przy użyciu tablic z mgrid.

Więc to będzie działać:

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

Innym sposobem generowania wymaganej tablicę z listy meshgrid jest zrobić to tablica, i toczyć 1st wymiar

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

Innym sposobem tworzenia siatka to np.ix_, która zwraca otwartą siatkę w postaci krotki. Tak otwarta siatka potrzebuje nadawania.

Pojedynczy punkt będzie interpolowana z albo:

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

Zobacz reakcja na prośbę Jana 4123 ciągnącej ma więcej dyskusji na temat whys.

Powiązane problemy