python-3.x - Python3,round() 类型不一致。舍入浮点值以索引列表或数组的正确方法
问题描述
我确切地说,我知道关于十进制表示的概念和所谓的相关问题,例如this、this和this,以及建议的文档。
仍然让我感到惊讶的是,在 Python3 中round()
有时会返回一个整数(根据文档),有时会返回一个浮点数(对我来说很奇怪),这取决于其第一个参数类型的不显着差异。
我理解,例如,floor()
或者ceil()
总是返回一个浮点数,当然我发现round(x, digits)
返回一个整数或浮点数是合理的,这取决于digits
是否指定了第二个参数,甚至round
存在不同的实现(例如 thebuiltin
和 the numpy
one)。
具体来说,以下代码显示 afloat32
和 a numpy.float32
makeround()
返回不同的类型:
>>> x=101/100
>>> x
1.01
>>> import numpy as np
>>> nx=np.float32(x)
>>> nx
1.01
>>> round(x)
1
>>> round(nx)
1.0
出于好奇,我将我的x
值作为 Keras 中分类模型的预测值,并且需要从中获取索引,通过四舍五入到最接近的整数,从字符串列表中选择正确的标签。
在 StackOverflow/Stackexchange 中的搜索并没有显示该问题已经得到处理。请给我一个有用的链接以防万一。
更具体地说,我从神经网络分类器中得到一个预测值,即一个接近 0 或 1 或另一个整数的数字,并希望将其用作打印与预测相关联的正确标签的索引(它应该几乎是基本需求)。
解决方案很简单,虽然丑陋:(int(round(x))
也解释在这里);但我仍然认为这是一种解决不良行为的方法。
我知道为什么这会起作用,所以问题不被理解,所以让我们问一下从值中获取整数和标签的正确 pythonic 方法是什么numpy.float32
,希望有人也能揭示这个背后的一个有趣的理由……嗯... 功能。
解决方案
round
委托给对象的__round__
方法。
In [367]: x = 123.34
In [368]: x.__round__()
Out[368]: 123
In [369]: np.float64(x).__round__()
Out[369]: 123.0
显然这个 numpy 回合返回了一个匹配的类型
In [376]: type(np.float(x).__round__())
Out[376]: int
In [377]: type(np.float32(x).__round__())
Out[377]: numpy.float32
In [378]: type(np.float64(x).__round__())
Out[378]: numpy.float64
In [379]: type(np.int32(x).__round__())
Out[379]: numpy.int32
因此,如果有可能是 numpy 浮点数之一,那么int(round(x))
可能是确保您有一个整数的最干净的方法。x
推荐阅读
- java - 如何在 Mockito 参数捕获器中多次捕获相同的对象
- html - Django 不接受 saas 文件但接受 css 文件
- javascript - 我需要在 webgl 中创建平滑的 alpha 过渡
- mysql - 我无法创建此程序
- dynamic - 具有多个标准的动态清单
- python - 连接图像中线条的最佳方法
- c# - 如何在 C# 中“添加”2 个字典?
- angular - 使用带有 NestJS 和 Fastify 的静态内容(Angular 8)时的路由问题
- c# - 为什么我的直接 Equals 调用通过,但嵌套时失败?
- python - 有没有办法在pygame中截取“截图”,然后将其保存为精灵以降低代码复杂度?