将 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.arrayxr.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 分配维度和坐标。