Python3, тип round () несовместим.Правильный способ округлить значение с плавающей точкой для индексации списка или массива - PullRequest
0 голосов
/ 04 декабря 2018

Я точно знаю, что мне известны концепции о десятичном представлении и предположительно соответствующие вопросы, такие как это , это и это и предлагаемые документация .

Все еще Я удивлен, что в Python3 round() иногда возвращает целое число (согласно документации ) , а иногдачисло с плавающей точкой (странно для меня), в зависимости от незначительной разницы в типе его первого аргумента .

Я понимаю, что, например, floor() или ceil() всегда возвращают число с плавающей точкой, и, конечно, я нашел разумным, что round(x, digits) возвращает целое число или число с плавающей точкой в ​​зависимости от второгоуказывается параметр digits или нет, и даже существуют различные реализации round (например, builtin и numpy one).

В частности, следующий код показывает, что float32 и numpy.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)) (также объяснено здесь );но я все еще считаю, что это своего рода обходной путь к нежелательному поведению.

Я знаю, что , почему это работает, поэтому вопросов не ценят, поэтому давайте спросим , что такое правильный питонический способ получить это целое число и эту метку из значения numpy.float32, в надежде, что кто-то обнародует также интересное обоснование этой ... эм ... функциональности.

1 Ответ

0 голосов
/ 04 декабря 2018

round делегирует объекту __round__ метод.

In [367]: x = 123.34
In [368]: x.__round__()
Out[368]: 123
In [369]: np.float64(x).__round__()
Out[369]: 123.0

Видимо, этот наглый раунд возвращает соответствующий тип

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)), вероятно, самый чистый способчтобы убедиться, что у вас есть целое число, если есть вероятность, что x является одним из числа с плавающей точкой.

...