Python中怎么对NumPy数组执行舍入_使用round函数保留小数位数

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.51.5都会舍入到偶数:np.round([0.5, 1.5])[0., 2.]

MyMap AI

使用AI将想法转化为图表

下载

关键细节:

  • 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()做显示控制,可能引入不必要的浮点误差累积,尤其在多次舍入+运算的流水线中。

真正需要数值级舍入的场景其实不多,多数时候只是展示需求——这点最容易被忽略。

相关推荐:

WPS表格怎么四舍五入_WPS数值修约函数ROUND【保留小数】

WPS表格中四舍五入有五种方法:一、ROUND函数标准修约;二、单元格格式仅隐藏小数;三、ROUNDUP强制向上舍入;四、ROUNDDOWN强制向下舍入;五、MROUND按指定基数舍入。 如果您在WPS表格中处理数值时发现小数位数过多,影响阅读或后续计算,则需要对数据进行四舍五入修约。以下是实现该目标的多种方法: 一、使用ROUND函数进行标准四舍五入 ROUND函数是WPS表格中最常用、最直接的...

如何在Python中为测试用例添加自定义标记_通过pytest.mark进行分类执行

pytest.mark 必须作为装饰器直接作用于测试函数或类,不可写在函数外部;可叠加多个标记,执行时用 -m "mark1 and mark2" 等布尔表达式筛选;未注册标记会触发警告,需在 pytest.ini 或 pyproject.toml 中声明以避免。 pytest.mark 能不能直接用在函数外面 不能。所有 pytest.mark 必须装饰在测试函数或类上,写在函数定义之外会报 S...
· Python · 158591

如何在Python中构建树状结构的递归生成器_使用yield from简化递归代码

yield from 在树遍历中省去了手动展开子生成器的繁琐与风险,自动处理委托调用、异常传播、StopIteration 捕获及协程方法转发,确保扁平化输出和行为一致性。 yield from 在树遍历中到底省了什么 直接说结论:yield from 不是语法糖,它把递归生成器的“委托调用”从手动循环 + yield 拆解成一条语句,避免了中间迭代器被提前耗尽、异常传播断裂、或 StopIter...
· Python · 256513

如何解决Python中的UnboundLocalError局部变量引用错误_使用global或nonlocal关键字声明

Python函数内同名变量报UnboundLocalError,因编译期将赋值变量标记为局部,读取在赋值前则出错;global用于模块级变量,nonlocal用于最近外层函数变量,二者不可混用且需提前声明。 为什么在函数里修改同名变量会报 UnboundLocalError Python 在编译函数时,只要看到某个变量在函数体内有赋值操作(哪怕只在 if 分支里),就会把它标记为局部变量。之后如果...
· Python · 81008

为什么Python脚本内存占用居高不下_使用objgraph与gc模块排查泄露

Python内存泄漏主因是对象被隐性持有而非未调gc.collect(),可用objgraph.show_growth()定位异常增长类型,再用gc.get_referrers()逆向追踪强引用源,并结合RSS监控与gc调试确认真实泄漏。 Python 脚本内存持续上涨,大概率不是“没调 gc.collect()”,而是对象根本没被识别为可回收——比如被全局容器悄悄持有、含 __del__ 的循环...
· Python · 282482

如何在Python Flask中集成Click命令行工具_使用app.cli.command

app.cli.command命令不出现的主因是Flask实例未完成初始化或注册时机过早;需确保在create_app()返回后注册,且装饰器顺序为@app.cli.command在上、@click.option等在下,同时避免顶层导入时执行注册。 为什么 app.cli.command 注册的命令不出现? 最常见原因是 Flask 应用实例未正确初始化 CLI 上下文,或者命令注册时机早于 ap...
· Python · 69466

为什么Python Tkinter Canvas保存的图片是空白_使用ImageGrab截取组件

Canvas无法直接保存为图片,需用ImageGrab截屏并精确计算坐标,Windows高DPI下须启用DPI感知并缩放坐标;更可靠方案是用PIL重绘所有元素。 Canvas 本身不支持直接保存为图片文件,所谓“保存空白”不是 bug,而是你根本没在保存 Canvas 的内容 Canvas 没有内置 save() 或 export() 方法 Tkinter 的 Canvas 是一个绘图容器,它只负...
· Python · 26656

Python Django 5.0如何使用异步视图提高并发_定义async def视图函数

Django 5.0 的 async 视图必须搭配 ASGI 服务器(如 uvicorn)运行,数据库操作需用 sync_to_async 包装或原生异步方法,避免阻塞事件循环;中间件、装饰器也须显式声明为 async 才能协同工作。 async def 视图函数必须搭配 ASGI 服务器运行 Django 5.0 的 async def 视图不会在 WSGI(如 Gunicorn + uWSGI...
· Python · 218287