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

时间:2018-12-04 16:31:28

标签: python-3.x list numpy indexing rounding

我想我知道关于十进制表示形式的概念以及诸如thisthisthis之类的相关问题以及建议的documentation。 / p>

仍然令我惊讶的是,在Python3中,round()有时返回一个整数(根据documentation,有时还会返回一个浮点数(对我),取决于其 first 参数类型的显着差异。

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

具体来说,以下代码显示了float32numpy.float32使round()返回不同的类型

    >>> 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))(也介绍了here);但我仍然认为这是解决不良行为的一种解决方法。

我知道为什么会这样工作问题不被理解,所以让我们问什么是从{中获取整数和标签的正确方法{1}}的价值,希望有人也能揭示此... ehm ...功能背后的有趣原理。

1 个答案:

答案 0 :(得分:3)

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

因此,如果int(round(x))是numpy浮点数之一,那么x可能是确保整数的最干净的方法。