首页 > 解决方案 > Python3,round() 类型不一致。舍入浮点值以索引列表或数组的正确方法

问题描述

我确切地说,我知道关于十进制表示的概念和所谓的相关问题,例如thisthisthis,以及建议的文档

仍然让我感到惊讶的是,在 Python3 中round()有时会返回一个整数(根据文档,有时会返回一个浮点数(对我来说很奇怪),这取决于其第一个参数类型的不显着差异。

我理解,例如,floor()或者ceil() 总是返回一个浮点数,当然我发现round(x, digits)返回一个整数或浮点数是合理的,这取决于digits是否指定了第二个参数,甚至round存在不同的实现(例如 thebuiltin和 the numpyone)。

具体来说,以下代码显示 afloat32和 a numpy.float32makeround()返回不同的类型

    >>> 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,希望有人也能揭示这个背后的一个有趣的理由……嗯... 功能。

标签: python-3.xlistnumpyindexingrounding

解决方案


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


推荐阅读