将 xarray 变量与 numpy 数组相乘
Multiply xarray variables with a numpy array
我有一个 xarray.DataArray
:
<xarray.DataArray 'eofs' (mode: 3, lat: 41, lon: 109)>
array([[[ 0.0436546 , 0.04423243, 0.04479113, ..., 0.02626665,
0.0257012 , 0.02513798],
[ 0.04490738, 0.04549405, 0.04606867, ..., 0.02734869,
0.026775 , 0.02619634],
[ 0.04613635, 0.04672573, 0.0473114 , ..., 0.02844015,
0.02785003, 0.02725326],
...,
[ 0.05721894, 0.05787764, 0.05852705, ..., 0.0474642 ,
0.04676448, 0.04606556],
[ 0.05649778, 0.05714934, 0.05779039, ..., 0.04714761,
0.04645796, 0.04576794],
[ 0.05573076, 0.05637409, 0.05700592, ..., 0.04678733,
0.04610882, 0.04542908]],
]]])
Coordinates:
* mode (mode) int32 0 1 2
* lat (lat) float64 50.0 50.25 50.5 50.75 51.0 ... 59.25 59.5 59.75 60.0
* lon (lon) float64 -2.0 -1.75 -1.5 -1.25 -1.0 ... 24.25 24.5 24.75 25.0
我想将每个模式与数组的一个元素相乘 array([68.8005905 , 17.8959575 , 8.46729004])
。知道怎么做吗?
这正是 xarray 旨在帮助您走上正轨的目的!
与依赖维度顺序和位置索引对齐数组的numpy不同,xarray依赖维度名称 和 坐标标签 。因此,确保 xarray 知道如何将 np.array
与 xr.DataArray
对齐的关键是为数组分配适当的维度名称和坐标。
在这种情况下:
multiplier = xr.DataArray(
[68.8005905 , 17.8959575 , 8.46729004],
dims=['mode'],
coords=[[0, 1, 2]],
)
现在您可以简单地将它们相乘!假设您的 DataArray 被称为 da
:
# these will be aligned automatically
da * multiplier
有关此主题的更多信息,请参阅 computation: automatic alignment 上的 xarray 文档。
或者,您仍然可以通过访问 DataArray.data
属性:
在 numpy 中执行此操作
da.data = da.data * np.array([68.8005905 , 17.8959575 , 8.46729004]).reshape(-1, 1, 1)
像这样使用直接数组操作时,正常的 numpy 广播规则适用。这几乎在所有情况下都比使用 xarray 的自动对齐更快,但也有缺点。如果更改维度,则不能将结果分配给同一个 DataArray 的数据属性,并且注意不要 re-order 值 - 直接分配给 .data
就像这是在玩火和移除了 xarray 为您确保数据对齐的能力 - 您已被警告!请注意,使用 da.data
的操作结果将是一个 numpy 数组(或正在使用的任何数组后端,例如 dask 数组),因此如果您确实想深入了解 numpy 然后返回 xarray,您总是可以像我上面那样创建一个新的 DataArray 并使用 DataArray constructor 分配维度和坐标。
我有一个 xarray.DataArray
:
<xarray.DataArray 'eofs' (mode: 3, lat: 41, lon: 109)>
array([[[ 0.0436546 , 0.04423243, 0.04479113, ..., 0.02626665,
0.0257012 , 0.02513798],
[ 0.04490738, 0.04549405, 0.04606867, ..., 0.02734869,
0.026775 , 0.02619634],
[ 0.04613635, 0.04672573, 0.0473114 , ..., 0.02844015,
0.02785003, 0.02725326],
...,
[ 0.05721894, 0.05787764, 0.05852705, ..., 0.0474642 ,
0.04676448, 0.04606556],
[ 0.05649778, 0.05714934, 0.05779039, ..., 0.04714761,
0.04645796, 0.04576794],
[ 0.05573076, 0.05637409, 0.05700592, ..., 0.04678733,
0.04610882, 0.04542908]],
]]])
Coordinates:
* mode (mode) int32 0 1 2
* lat (lat) float64 50.0 50.25 50.5 50.75 51.0 ... 59.25 59.5 59.75 60.0
* lon (lon) float64 -2.0 -1.75 -1.5 -1.25 -1.0 ... 24.25 24.5 24.75 25.0
我想将每个模式与数组的一个元素相乘 array([68.8005905 , 17.8959575 , 8.46729004])
。知道怎么做吗?
这正是 xarray 旨在帮助您走上正轨的目的!
与依赖维度顺序和位置索引对齐数组的numpy不同,xarray依赖维度名称 和 坐标标签 。因此,确保 xarray 知道如何将 np.array
与 xr.DataArray
对齐的关键是为数组分配适当的维度名称和坐标。
在这种情况下:
multiplier = xr.DataArray(
[68.8005905 , 17.8959575 , 8.46729004],
dims=['mode'],
coords=[[0, 1, 2]],
)
现在您可以简单地将它们相乘!假设您的 DataArray 被称为 da
:
# these will be aligned automatically
da * multiplier
有关此主题的更多信息,请参阅 computation: automatic alignment 上的 xarray 文档。
或者,您仍然可以通过访问 DataArray.data
属性:
da.data = da.data * np.array([68.8005905 , 17.8959575 , 8.46729004]).reshape(-1, 1, 1)
像这样使用直接数组操作时,正常的 numpy 广播规则适用。这几乎在所有情况下都比使用 xarray 的自动对齐更快,但也有缺点。如果更改维度,则不能将结果分配给同一个 DataArray 的数据属性,并且注意不要 re-order 值 - 直接分配给 .data
就像这是在玩火和移除了 xarray 为您确保数据对齐的能力 - 您已被警告!请注意,使用 da.data
的操作结果将是一个 numpy 数组(或正在使用的任何数组后端,例如 dask 数组),因此如果您确实想深入了解 numpy 然后返回 xarray,您总是可以像我上面那样创建一个新的 DataArray 并使用 DataArray constructor 分配维度和坐标。