You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

原地舍入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 12:30:42