簡體   English   中英

從坐標標簽計算 xarray 數據數組

[英]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。 細胞

Xarray "vci" 具有幾十年的每月植被狀況指數

如果數據集足夠小,我可以將其導出為 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM