numpy数组不能用python内置round()函数,应使用np.round()等numpy舍入函数;np.round()默认decimals=0,支持负数及银行家舍入,返回新数组且不改变原dtype。

NumPy数组不能直接用Python内置round()函数
直接对NumPy数组调用round()会报错或返回意外结果,因为Python内置的round()只支持标量(如float、int),不支持ndarray。你可能会看到TypeError: type numpy.ndarray doesn't define __round__ method,或者得到一个未被修改的原数组(尤其在旧版本中)。
正确做法是使用NumPy自己的舍入函数:
-
np.round()(推荐):行为与内置round()一致,支持decimals参数,且能广播到整个数组 -
np.around():和np.round()完全等价,是别名,可互换使用 -
np.rint():只向最近整数舍入(不支持小数位),用于整数化场景
np.round()的decimals参数控制小数位,但要注意默认值
np.round()默认decimals=0,即舍入到整数位。想保留2位小数,必须显式传参:np.round(arr, decimals=2)。漏掉decimals会导致所有数变成整数,容易误判为“没生效”。
示例:
import numpy as np arr = np.array([1.234, 2.567, 3.999]) print(np.round(arr, decimals=2)) # [1.23 2.57 4. ]
注意:decimals可为负数,例如decimals=-1表示舍入到十位(123 → 120)。
round() vs np.round()在浮点精度上的表现一致,但中间计算不改变原数组
两者都遵循“四舍六入五成双”(银行家舍入),不是简单四舍五入。比如0.5和1.5都会舍入到偶数:np.round([0.5, 1.5]) → [0., 2.]。
关键细节:
-
np.round()默认返回新数组,原数组不变;如需就地修改,加out参数:np.round(arr, decimals=1, out=arr) - 若数组dtype是整数(如
int64),np.round()仍会返回浮点型结果(float64),不会自动转回整数 - 对NaN或inf值,
np.round()保持原样,不报错
当需要格式化输出而非数值计算时,别混淆round和字符串格式化
如果目标是打印或导出“看起来保留两位小数”的字符串(比如写入CSV或日志),np.round()不是必需步骤——它改变的是数值本身。更轻量的做法是用f-string或np.array2string()控制显示精度:
arr = np.array([1.23456, 2.78912])
print(f"{arr[0]:.2f}") # "1.23"
print(np.array2string(arr, precision=2, suppress_small=True)) # "[1.23 2.79]"
误用np.round()做显示控制,可能引入不必要的浮点误差累积,尤其在多次舍入+运算的流水线中。
真正需要数值级舍入的场景其实不多,多数时候只是展示需求——这点最容易被忽略。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











