如何使用 `.sel()` 索引器更新 `xarray.DataArray`?
How to update `xarray.DataArray` using `.sel()` indexer?
我发现可视化创建 N-dimensional
DataArray
的最简单方法是创建 np.ndarray
,然后用我创建的坐标填充值。当我尝试实际操作时,我不知道如何更新 xr.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
这真的很尴尬,因为 Python 语法的不幸限制是方括号内不支持关键字参数。
因此,您需要将 .sel
的参数作为字典放入 .loc
中:
DA.loc[dict(axis_A="A_1", axis_B="B_1", axis_C="C_1")] = 1
我发现可视化创建 N-dimensional
DataArray
的最简单方法是创建 np.ndarray
,然后用我创建的坐标填充值。当我尝试实际操作时,我不知道如何更新 xr.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
这真的很尴尬,因为 Python 语法的不幸限制是方括号内不支持关键字参数。
因此,您需要将 .sel
的参数作为字典放入 .loc
中:
DA.loc[dict(axis_A="A_1", axis_B="B_1", axis_C="C_1")] = 1