我有一個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])。知道怎么做嗎?
uj5u.com熱心網友回復:
這正是 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
有關此主題的更多資訊,請參閱有關計算的 xarray 檔案:自動對齊。
或者,您仍然可以通過訪問DataArray.data屬性在 numpy 中執行此操作:
da.data = da.data * np.array([68.8005905 , 17.8959575 , 8.46729004]).reshape(-1, 1, 1)
當使用像這樣的直接陣列操作時,正常的 numpy 廣播規則適用。這幾乎在所有情況下都比使用 xarray 的自動對齊更快,但也有缺點。如果您更改尺寸,則不能將結果分配給相同的 DataArray 的資料屬性,并且注意不要重新排序值 -像這樣直接分配.data是在玩火,并消除 xarray 確保資料對齊的能力- 你已被警告!請注意,使用操作的結果da.data將是一個 numpy 陣列(或任何正在使用的陣列后端,例如一個 dask 陣列),所以如果您確實想使用 numpy 然后回到 xarray,就像我在上面所做的那樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/479494.html
