Отрицательное 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.