2012-10-05 65 views
1

我有一個問題,我一直無法正確使用scipy解決。我想 重新採樣和數組,使我減少分辨率(從較高到較低),但是,這裏的東西有問題,新的陣列形狀不是舊的因素。 例如:從高分辨率重採樣陣列到低

lat = scipy.mgrid[-14.0:14+0.25:0.25] 
lon = scipy.mgrid[100.0:300+0.25:0.25] 
z = rand((lat.shape[0],lon.shape[0])) 
new_res = 0.70135 

現在我有具有0.25的空間分辨率的陣列z和欲降低這種至new_res。任何想法如何使用scipy或手工完成?另一個複雜的情況是數組z中經常會存在不好的數據,即z [0.20]可能是nan。

感謝您的幫助和想法

回答

2

一個快速的方法來做到這一點是使用scipy.ndimage.interpolation.map_coordinates

lat = scipy.mgrid[-14.0:14+0.25:0.25] 
lon = scipy.mgrid[100.0:300+0.25:0.25] 
z = tile(lon,(len(lat),1)) 
new_res = 0.70135 


new_lat = scipy.mgrid[-14.0:14+0.25:new_res] 
new_lon = scipy.mgrid[100.0:300+0.25:new_res] 
X,Y = meshgrid(((new_lat-np.min(lat))/(np.max(lat)-np.min(lat)))*lat.shape[0],((new_lon-np.min(lon))/(np.max(lon)-np.min(lon)))*lon.shape[0]) 
pts = np.asarray(zip(X.ravel(),Y.ravel())).T 
new_z = scipy.ndimage.interpolation.map_coordinates(z,pts).reshape(len(new_lon),len(new_lat)).T 

所有在meshgrid調用那些亂七八糟的是真正的單位轉換 - >陣列單位。我不知道這將如何處理NaN,我懷疑你將不得不首先清理數據或接受NaN的地區,當你重新採樣。

這個tutorial也可能有用。

+0

我想了解你的代碼。那裏有很多我不明白的地方 - 並不像python程序員那樣。我想盡可能避免對數據進行插值。我會測試這個代碼並看看。謝謝。 – Shejo284

+0

如果你想下采樣你的數據是除了簡單地求和像素平方以外的任何方式,那麼你必須做一些插值。軸約定的差異會導致代碼比嚴格必要的更復雜。 – tacaswell

+0

是的,你是對的。我試着總結正方形,但是這會導致更復雜的方法和代碼。我嘗試了你的方法,結果變得太嘈雜和錯誤的地方。我認爲這是因爲數據類型非常數字化。 – Shejo284

相關問題