我想将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
有关。显然float32
的dtype
与.round
的关系不太好。
为了解决这个问题,我使用.astype('float64')
将数据转换为dtype
float64
,并且舍入工作如预期。