2014-10-09 71 views
1

我正在使用griddata在網格上重新取樣numpy 2維數組。python griddata的替代品

z.shape = (1000, 1000) 
x, y = np.arange(-5, 5, 0.01), np.arange(-5, 5, 0.01) 
newx, newy = np.arange(-2, 2, 0.1), np.arange(-2, 2, 0.1) 

griddata((x, y), z, (newx[None, :], newy[:, None])) 

代碼應:

  • 重新採樣Z(其表示的圖像)到一個新的較粗較細網格
  • 新柵格不必覆蓋所有的原始的一。

但是,griddata無法管理常規輸入網格。有誰知道一個簡單的選擇?

+0

你能解釋一下'管理一個普通的輸入網格嗎? – wwii 2014-10-09 12:11:19

+0

@wwii嗨,我的意思是griddata不能使用矩形網格,其中x和y座標是對齊的。我認爲這是因爲它使用三角測量。 – astabada 2014-10-09 15:06:36

回答

1

使用任何適合用於文檔中列出在網格數據的方法:https://docs.scipy.org/doc/scipy/reference/interpolate.html#multivariate-interpolation

即:

https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.RegularGridInterpolator.html

https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.RectBivariateSpline.html

https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.interpolation.map_coordinates.html

注還表示您正在使用griddata不正確。您的代碼對應於由您的1000(x,y)座標定義的線進行插值,其中每個點都有1000個與其關聯的值。然而,從一維線插值到二維的定義很差,並且嘗試對一條線上的一組點進行三角測量導致失敗。

你應該做

import numpy as np 
from scipy.interpolate import griddata 

z = np.random.rand(100, 100) 
z.shape = (100, 100) 
x, y = np.arange(-5, 5, 0.1), np.arange(-5, 5, 0.1) 

xx, yy = np.meshgrid(x, y, indexing='ij') 

newx, newy = np.arange(-2, 2, 0.1), np.arange(-2, 2, 0.1) 

griddata((xx.ravel(), yy.ravel()), z.ravel(), (newx[None, :], newy[:, None])) 

這將正常工作---然而,1000×1000 = 1000000個在2D點是基於三角測量的非結構化插值簡直太多數據(需要大量內存的三角+它很慢),所以你應該使用網格數據算法。

+0

感謝您的回答,並指出我的示例中的錯誤(令人尷尬)。 – astabada 2014-10-09 16:35:17

+0

我計劃通過展示我如何使用RectBivariateSpline來更新您的答案。你介意我做嗎?我想,你總是可以回覆。 – astabada 2014-10-09 17:05:11