Почему отрицательный numpy.float64 дает nan, когда возводится в степень с дробным числом? - PullRequest
0 голосов
/ 08 октября 2018

Отрицательное numpy.float64, возведенное в степень с дробным (т. Е. Десятичным, т. Е. Рациональным) числом, даст результат nan и предупреждение.

То же число с использованием типа float Python возвращаетcomplex результат.

Вот минимальный пример использования Python 3.6.6 (комментарий к Python 2.7.15 см. Ниже):

>>> import numpy as np
>>> f = -2.0
>>> npf = np.float64(-2.0)
>>> f**1.1
(-2.0386342710747223-0.6623924280875919j)
>>> npf ** 1.1
__main__:1: RuntimeWarning: invalid value encountered in double_scalars
nan

Я попробовал numpy.powerФункция получает другое предупреждение и тот же результат.

>>> np.power(f, 1.1)
__main__:1: RuntimeWarning: invalid value encountered in power
nan
>>> np.power(npf, 1.1)
nan

Предупреждение в последнем появляется только после того, что выполняется первым.

Я столкнулся с этим, используя numpy.array с плавающей запятой,которые во всех остальных случаях (?) ведут себя так же, как плавающие Python.Преобразование из float в numpy.float64 происходит неявно, поэтому мне потребовалось некоторое время, чтобы найти источник проблемы.

Теперь я могу обойти это путем явного преобразования или указания dtype, когдасоздавая массив как numpy.complex:

>>> npc = np.complex(-2.0)
>>> npc ** 1.1
(-2.0386342710747223-0.6623924280875919j)
>>> np.power(npc, 1.1)
(-2.0386342710747223-0.66239242808759191j)

(обратите внимание на различную точность вывода O_o, я могу с этим смириться)

Мой вопрос: Зачем??Почему numpy не возвращает numpy.complex при необходимости.Он преобразует в numpy.float64, например, при делении numpy.int64:

>>> ai = np.array([1])
>>> ai.dtype
dtype('int64')
>>> ai/2
array([ 0.5])
>>> (ai/2).dtype
dtype('float64')

Почему бы не применить ту же философию, когда numpy.float64 не способен выразить результатвычисление и использование numpy.complex64 вместо?

комментарий к Python 2.7.15: с этой версией, возведение в степень float с дробным числом вызывает исключение, явно используя complexрешает проблему:

>>> f ** 1.1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: negative number cannot be raised to a fractional power
>>> complex(-2.0) ** 1.1
(-2.0386342710747223-0.6623924280875919j)

Это эквивалентно поведению numpy.

1 Ответ

0 голосов
/ 08 октября 2018

Наверное, просто тупые разработчики просто не подумали охватить это дело.Вы можете поставить вопрос на Github .В противном случае вам просто придется явно выполнить преобразование complex.Было бы неплохо поставить вопрос, чтобы над ним могли поработать разработчики.

...