2014-04-11 59 views
9

爲什麼下面的調用griddata失敗?Scipy - 3d griddata - 爲什麼有必要將griddata xi參數轉換爲元組?

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

發生以下例外: ValueError異常:在XI維數不匹配X

如果我投的XI(grid_vals)參數元組:

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

誤差變爲遠。爲什麼?

回答

3

的基本原因是griddata通過points = _ndim_coords_from_arrays(points)函數,它的文檔讀取通過這兩個pointsxi:在元組

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

和關鍵行動是:

p = np.broadcast_arrays(*points) 

別的,包括列表,只是轉換爲陣列:

points = np.asanyarray(points) 

實際插值需要最後一個帶有「3d」維的數組。

因此,您的3 (200,200,200)數組列表變爲(3,200,200,200)形狀的數組。但是你的points數組是(50,3)。來自200number of dimensions in xi does not match x消息結果不匹配3

griddata文件是明確的關於points,較少xi。但是它的示例使用(x, Y)使用來自mgrid的數組。

所以這會工作:

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

meshgrid列表生成所需的陣列的另一種方法是使它成爲一個陣列,並推出第一維

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

發生的另一種方式一個網格是np.ix_,它以元組的形式返回一個開放的網格。像這樣的開放網格確實需要廣播。

單一指向將與進行插值之一:

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

見反應約翰4123拉請求有關於個爲什麼更多的討論。