[英]Calculate xarray dataarray from coordinate labels
我有一個 DataArray,其中有兩個變量(氣象數據)隨時間,y,x 坐標。 x 和 y 坐標位於投影坐標系 (EPSG:3035) 中並對齊,以便每個單元格幾乎完全覆蓋1 公里 LAEA 參考網格的標准單元格
我想准備數據以在 Pandas 和/或數據庫表中進一步使用,所以我想添加 LAEA Gridcell Number/Label,可以通過以下(偽)function 直接從 x 和 y 計算
def func(cell):
return r'1km{}{}'.format(int(cell['y']/1000), int(cell['x']/1000)) # e.g. 1kmN2782E4850
但據我所知,似乎不可能將這個 function 應用於 DataArray 或 DataSet 以便我可以訪問這些坐標變量(至少.apply_ufunc()
並沒有真正為我工作。
稍后我可以在 Pandas 上計算這個,但我的一些數據集包含 60 到 120 個 Mio。 單元格/行/數據集和 pandas(即使使用 Numba)似乎在這個數量上存在問題。 在 xarray 上,我可以通過 Dask 在 32 個核心上處理它。
我將不勝感激有關如何使其工作的任何建議。
編輯:對我正在使用的數據的更多見解:
這是最大的一個,有 500 個 Mio 單元,但我可以將其下采樣到平方公里分辨率,最終得到大約 160 個 Mio。 細胞
如果數據集足夠小,我可以將其導出為 pandas dataframe 並在那里計算,但這很慢而且不是很健壯,因為 kernel 經常崩潰
這是您可以應用 function 的方法:
import xarray as xr
# ufunc
def func(x, y):
#print(y)
return r'1km{}{}'.format(int(y), int(x))
# test data
ds = xr.tutorial.load_dataset("rasm")
xr.apply_ufunc(
func,
ds.x,
ds.y,
vectorize=True,
)
請注意,您不必在您的情況下列出input_core_dims
。
此外,由於您的 function 未矢量化,因此您需要設置vectorized=True
:
vectorize: bool, optional 如果為真,則假設
func
僅將在核心維度上定義的 arrays 作為輸入,並使用:py:func:numpy.vectorize
自動對其進行矢量化。 存在此選項是為了方便,但幾乎總是比提供預矢量化的 function 慢。 使用此選項需要 NumPy 版本 1.12 或更高版本。
使用vectorized
可能不是性能最高的選項,因為它本質上只是循環,但如果您將數據分塊並使用dask
,它可能就足夠了。
如果沒有,您可以考慮使用例如 numba 創建一個矢量化的 function,這肯定會加快速度。
更多信息可以在關於應用 ufuncs 的 xarray 教程中找到
您可以以非矢量化方式使用apply_ufunc
:
def func(x, y):
return f'1km{int(y/1000)}{int(x/1000)}' # e.g. 1kmN2782E4850
xr.apply_ufunc(
func, # first the function
x.x, # now arguments in the order expected by 'func'
x.y
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.