2017-10-16 21 views
0

這是一個很遠的鏡頭,但我想我會在寫這個之前問自己。將一個立方體變成一個數據點和x,y和z列表的列表

我有一個三維立方體的數據與lon,lat和高度座標。我想要所有點的數據的4個一維向量,lon,lat,height和data。這樣我就可以將它寫入一個ASCII文件,並將它作爲包含它們位置的點列表。這樣做對數據來說很容易,但重構的部分是將座標轉換爲正確的矢量。

有沒有人已經做過,並有一些提示?

回答

1

我不是100%確定我已經正確理解了這個目標,但是像這樣的事情會做你想做的事嗎?

lats = [] 
lons = [] 
heights = [] 
data = [] 
for point_cube in cube.slices_over(['latitude', 'longitude', 'height']): 
    lats.append(point_cube.coord('latitude').points[0]) 
    lons.append(point_cube.coord('longitude').points[0]) 
    heights.append(point_cube.coord('height').points[0]) 
    data.append(point_cube.data) 

或者解釋某事(幾乎可以肯定)更有效,你可以探索使用numpy.meshgrid功能把你的1-d coord.points陣列成3-d陣列,然後你可以以同樣的方式處理,因爲數據陣列。

+0

謝謝,這將工作。我認爲meshgrid也會有用,好的電話。 –

+0

使用meshgrid,我遇到的問題是確保我將真正擁有每個數據點的正確座標。所以數據將由cube.data.reshape()給出。但是,我不知道多維數據集數據是否可以依賴於特定的順序(c或fortran),或者如何確保mesgrid的參數順序對此做出響應。這一切都變得相當複雜...... –

1

另一種選擇是使用itertools構建所有座標點的產品和扁平立方體的數據數組:

points_prod = itertools.product(cube.coord('height').points, 
           cube.coord('latitude').points, 
           cube.coord('longitude').points) 
flat_data = cube.data.reshape(-1) 

itertools產品爲發電機,我們可以通過把它轉換成一個列表消耗。然後,我們可以對產品列表和展平數據數組進行索引。產品列表中的索引i將是扁平的數據數組中的座標點的數據值i

points_prod_list = list(points_prod) 
print '{} -- {}'.format(points_prod_list[i], flat_data[i]) 

有關具體數據排序的思考,並確保你有每個數據點的座標權...

只要您獲得尺寸順序與打印順序相同,就會始終將正確的座標點值與這些點值描述的數據值關聯起來。

這是很難描述,但可以合理簡單地使用上面的代碼來演示。它涉及這樣一個事實,即第一個打印的維度座標描述了該多維數據集的數據數組的最外面的軸,itertools.product創建所有輸入組合的乘積的順序,以及NumPy使數組變平的順序。但從根本上說,Iris本身依靠這些排序來確保其座標點值能夠描述正確的數據值!

相關問題