Отрицательный показатель степени с операндом массива NumPy - PullRequest
5 голосов
/ 27 марта 2012

стандартная мощность (**) в Python не работает при отрицательной мощности! Конечно, я мог бы написать формулу иначе, с разделением и положительной силой. Тем не менее, я проверяю результаты рутины оптимизации, и иногда мощность отрицательна, иногда она положительна. Здесь снова можно использовать оператор if, но мне интересно, есть ли там обходные пути и библиотека Python, где допускается негативная экспозиция. Спасибо и всего наилучшего.

Ответы [ 5 ]

5 голосов
/ 27 марта 2012

Какую версию python вы используете? У меня отлично работает в Python 2.6, 2.7 и 3.2:

>>> 3**-3 == 1.0/3**3
True

и с numpy 1.6.1:

>>> import numpy as np
>>> arr = np.array([1,2,3,4,5], dtype='float32')
>>> arr**-3 == 1/arr**3
array([ True,  True,  True,  True,  True], dtype=bool)
4 голосов
/ 14 марта 2017

Это может быть Python 3, так как я использую 3.5.1, и я считаю, что это ошибка, у вас есть ...

for c in np.arange(-5, 5):
    print(10 ** c)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-79-7232b8da64c7> in <module>()
      1 for c in np.arange(-5, 5):
----> 2     print(10 ** c)

ValueError: Integers to negative integer powers are not allowed.

Просто замените его на число с плавающей точкой, и оно будет работать.

for c in np.arange(-5, 5):
    print(10 ** float(c))

1e-05
0.0001
0.001
0.01
0.1
1.0
10.0
100.0
1000.0
10000.0

как ни странно, он работает в базовом питоне 3:

for i in range(-5, 5):
    print(10 ** i)

1e-05
0.0001
0.001
0.01
0.1
1
10
100
1000
10000

казалось, что он отлично работает для Python 2.7.12:

Python 2.7.12 (default, Oct 11 2016, 05:24:00) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> for c in np.arange(-5, 5):
...     print(10 ** c)
... 
1e-05
0.0001
0.001
0.01
0.1
1
10
100
1000
10000
1 голос
/ 27 марта 2012

Возможно, используйте встроенный NumPy / SciPy, power

>>> import numpy as NP
>>> A = 10*NP.random.rand(12).reshape(4, 3)
>>> A
 array([[ 5.7 ,  5.05,  7.28],
        [ 3.61,  9.67,  6.27],
        [ 5.29,  2.8 ,  0.58],
        [ 5.94,  4.9 ,  1.68]])

>>> NP.power(A, -2)
  array([[ 0.03,  0.04,  0.02],
         [ 0.08,  0.01,  0.03],
         [ 0.04,  0.13,  2.98],
         [ 0.03,  0.04,  0.35]])
0 голосов
/ 11 апреля 2018

У меня была та же проблема с Python 2.7, и в результате я получил отображение показателей для плавания.Не могу сказать, что это лучшее решение.

np.power(10, map(lambda n: float(n), np.arange(-5, 6)))
0 голосов
/ 25 января 2016

Я думал, что столкнулся с тем же самым, но понял, что не заставил массив быть float. Когда-то я так и вел себя, как ожидал. Возможно, вы сделали что-то подобное?

>>> import numpy as np
>>> arr = np.array([[1,2,3,4],[8,9,10,11]])
>>> arr
 array([[ 1,  2,  3,  4],
        [ 8,  9, 10, 11]])

>>> arr ** -1
 array([[1, 0, 0, 0],
        [0, 0, 0, 0]])

>>> arr ** -1.0
 array([[ 1.        ,  0.5       ,  0.33333333,  0.25      ],
        [ 0.125     ,  0.11111111,  0.1       ,  0.09090909]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...