原地舍入xarray数据失效:调用函数后结果不符合预期
问题:Xarray数据舍入到2位小数后外部调用未生效
我尝试编写函数将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位小数的值,但实际未生效。
补充说明:函数内部执行data_arr.data = data_arr.data.round(decimals = 2)后,data_arr.values显示为[-50.41, -50.42, -50.42],是正确的舍入结果;但外部调用函数后,打印data_values.values得到的却是[-50.409999, -50.419998, -50.419998],不符合预期。
原因分析
Xarray的DataArray.data是底层数组(如numpy数组)的视图,直接修改data属性可能因浮点数精度存储特性或视图/副本的引用逻辑,导致外部无法正确获取修改后的值。此外,Xarray官方推荐使用内置方法操作数据,而非直接修改底层data属性。
正确解决方案
直接使用Xarray原生的round()方法,它会返回全新的DataArray对象,确保修改后的数据能正确传递:
方法1:直接调用原生方法
data_values = data_values.round(decimals=2)
方法2:修改原函数(保留函数形式)
如果需要封装成函数,应基于原数据创建新的DataArray,而非直接修改data属性:
def round_dim(data_arr): return data_arr.round(decimals=2)
调用方式不变:
data_values = round_dim(data_values)
额外说明
出现[-50.409999, -50.419998]这类结果是浮点数的二进制存储特性导致的——部分十进制小数无法被二进制精确表示,舍入后的50.41在底层存储时会显示为近似值。如果需要确保输出为两位小数格式,可在打印时格式化:
print([round(val, 2) for val in data_values.values]) # 或用numpy格式化打印 import numpy as np print(np.round(data_values.values, 2))
内容的提问来源于stack exchange,提问作者user20816596
相关产品推荐
相关产品推荐

