numpy 当数据数组相乘时,xarray的行为是什么?

vuktfyat  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(128)

我想将两个相同维度的数据数组相乘:

print(data1)
<xarray.DataArray 'var' (lat: 2160, lon: 4320)>
[9331200 values with dtype=int8]
Coordinates:
  * lon      (lon) float64 -180.0 -179.9 -179.8 -179.7 ... 179.8 179.9 180.0
  * lat      (lat) float64 89.96 89.88 89.79 89.71 ... -89.79 -89.88 -89.96

print(data2)
<xarray.DataArray 'var' (lat: 2160, lon: 4320)>
[9331200 values with dtype=float32]
Coordinates:
  * lon      (lon) float64 -180.0 -179.9 -179.8 -179.7 ... 179.8 179.9 180.0
  * lat      (lat) float64 89.96 89.88 89.79 89.71 ... -89.79 -89.87 -89.96

data1 * data2返回以下错误:

ValueError: Cannot apply_along_axis when any iteration dimensions are 0

注意,在this thread之后,我确保了维度的一致性,并对两个数据数组重新建立了索引。
由于两个数组都有不同的dtype,我尝试了data1.astype(np.float64) * data2,但返回了相同的错误。
另一方面,这返回了一个空数组:

data3 = data1.astype(np.float64) * data2.astype(np.float64)

print(data3)
<xarray.DataArray 'var' (lat: 0, lon: 0)>
array([], shape=(0, 0), dtype=float64)
Coordinates:
  * lon      (lon) float64 
  * lat      (lat) float64

我发现实现这个乘法的唯一方法是获取底层的np数据:

data3 = data1.data * data2.data

虽然这符合我的需要,但我仍然很想知道为什么纯xarray方法会失败。有谁能告诉我或指出我可能错过的文档的一部分吗?

55ooxyrt

55ooxyrt1#

对于那些感兴趣的人来说,我的两个数据数组的坐标有轻微的差异,显然是由于浮点精度(感谢these guys)。您可以使用以下命令来确定两个数据数组的坐标是否正确:

import xarray as xr 

xr.testing.assert_equal(data1.lon, data2.lon)
xr.testing.assert_equal(data1.lat, data2.lat)

在确定坐标应该对齐的情况下,一个选项是手动校正坐标:

data1['lon'] = data2['lon']
data1['lat'] = data2['lat']

那么乘法就不会有问题了。

相关问题