2016-10-13 16 views
1

我發現創建N-dimensional 可視化的最簡單方法是創建一個np.ndarray,然後用我創建的座標填充值。當我試圖真正做到這一點時,我無法弄清楚如何更新xr.DataArray如何使用`.sel()`索引器更新`xarray.DataArray`?

如何更新xr.DataArray我已經使用我創建的標籤進行了初始化?我的實際數據是一個非常複雜的數據集,但總結了我正在嘗試做的事情。我可以使用.loc,但有時我的ndarrays會變得非常龐大而複雜,因爲我並不真正瞭解昏暗的順序。

# Construct DataArray 
DA = xr.DataArray(np.ndarray((3,3,5)), dims=["axis_A","axis_B","axis_C"], coords={"axis_A":["A_%d"%_ for _ in range(3)], 
                        "axis_B":["B_%d"%_ for _ in range(3)], 
                       "axis_C":["C_%d"%_ for _ in range(5)]}) 
# <xarray.DataArray (axis_A: 3, axis_B: 3, axis_C: 5)> 
# array([[[ 0., 0., 0., 0., 0.], 
#   [ 0., 0., 0., 0., 0.], 
#   [ 0., 0., 0., 0., 0.]], 

#  [[ 0., 0., 0., 0., 0.], 
#   [ 0., 0., 0., 0., 0.], 
#   [ 0., 0., 0., 0., 0.]], 

#  [[ 0., 0., 0., 0., 0.], 
#   [ 0., 0., 0., 0., 0.], 
#   [ 0., 0., 0., 0., 0.]]]) 
# Coordinates: 
# * axis_B (axis_B) <U3 'B_0' 'B_1' 'B_2' 
# * axis_A (axis_A) <U3 'A_0' 'A_1' 'A_2' 
# * axis_C (axis_C) <U3 'C_0' 'C_1' 'C_2' 'C_3' 'C_4' 

# # Update? 
DA.sel(axis_A="A_1", axis_B="B_1", axis_C="C_1").values = 1 
DA.max() 
# # <xarray.DataArray()> 
# # array(0.0) 

DA.sel(axis_A="A_1", axis_B="B_1", axis_C="C_1") = 1 
# # File "<ipython-input-17-8feb7332633f>", line 4 
# #  DA.sel(axis_A="A_1", axis_B="B_1", axis_C="C_1") = 1 
# #              ^
# # SyntaxError: can't assign to function call 

回答

2

這實在是尷尬,由於Python語法的不幸限制,即關鍵字參數沒有在裏面括號支持。

因此,相反,你需要把參數.sel的字典中.loc代替:

DA.loc[dict(axis_A="A_1", axis_B="B_1", axis_C="C_1")] = 1 
+0

再次感謝@Stephan!我在http://xarray.pydata.org/en/stable/indexing.html上看到了這種語法,但並不知道你可以用這種方式更新。 –