舍入并覆盖xarray数据



我想将xarray中的所有值四舍五入到小数点后2位。

我已经试过了:

def round_dim(data_arr):
data_arr.data = data_arr.data.round(decimals = 2)
return data_arr

我这样称呼它:

data_values = <xarray.core.dataarray.DataArray>
data_values = round_dim(data_values)

我希望data_values现在显示相同的值,但四舍五入到小数点后2位,但这并没有发生。

编辑

当我查看数据时,它如下:

def round_dim(data_arr):
#(data_arr.values) is [-50.406578, -50.415337, -50.42315]
data_arr.data = data_arr.data.round(decimals = 2)
#(data_arr.values) is [-50.41, -50.42, -50.42]
return data_arr

可以看到,在data_arr.data = data_arr.data.round(decimals = 2)之后,我确实得到了正确的舍入。

然而,做:

data_values = <xarray.core.dataarray.DataArray>
data_values = round_dim(data_values)
print(data_values.values)

我没有得到正确的四舍五入值,而是:

[-50.409999, -50.419998, -50.419998]

我希望数据数组看起来像[-50.41, -50.42, -50.42]

如果您想将round(decimals = 2)应用于您的整个数据集,您可以使用xarray.Dataset.map

返回副本对于所有数据都四舍五入的原始数据集,它不能在适当的位置工作。

import numpy as np
import xarray
dataset = xarray.Dataset()
dataset["a"] = xarray.DataArray(np.linspace(0, 1, 10))
dataset["b"] = xarray.DataArray(np.arange(10))
print(dataset)
# <xarray.Dataset>
# ...
#    a        (dim_0) float64 0.0 0.1111 0.2222 0.3333 ... 0.7778 0.8889 1.0
#    b        (dim_0) int32 0 1 2 3 4 5 6 7 8 9
def round_dim(dataset):
return dataset.map(lambda a: np.round(a, decimals=2))
dataset = round_dim(dataset)
print(dataset)
# <xarray.Dataset>
# ...
#     a        (dim_0) float64 0.0 0.11 0.22 0.33 0.44 0.56 0.67 0.78 0.89 1.0
#     b        (dim_0) int32 0 1 2 3 4 5 6 7 8 9

所以问题是与数据的dtype有关。显然float32dtype.round的关系不太好。

为了解决这个问题,我使用.astype('float64')将数据转换为dtypefloat64,并且舍入工作如预期。

最新更新