我想将两个相同维度的数据数组相乘:
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方法会失败。有谁能告诉我或指出我可能错过的文档的一部分吗?
1条答案
按热度按时间55ooxyrt1#
对于那些感兴趣的人来说,我的两个数据数组的坐标有轻微的差异,显然是由于浮点精度(感谢these guys)。您可以使用以下命令来确定两个数据数组的坐标是否正确:
在确定坐标应该对齐的情况下,一个选项是手动校正坐标:
那么乘法就不会有问题了。