11

standard power operation (**) in Python does not work for negative power! Sure I could write the formula otherwise, with divide and positive power. However, I am checking optimization routine result, and sometimes power is negative, sometimes it is positive. Here again a if statement could do, but I am wondering if there is a workarouns and a Python library where negative exposant is allowed. Thanks and Regards.

1
  • Your question does not work for my code: ideone.com/MO6EJ I am not familiar with the concept of exposant, but as far as exponents are concerned, they are completely valid. Eg. 2 ** (-2) will give you 0.25. Commented Mar 27, 2012 at 10:41

5 Answers 5

7

Which version of python are you using? Perfectly works for me in Python 2.6, 2.7 and 3.2:

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

and with 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)
Sign up to request clarification or add additional context in comments.

Comments

6

It may be a Python 3 thing as I'm using 3.5.1 and I believe this is the error you have...

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.

Just change it to a float and it'll should work.

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

oddly enough, it works in base python 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

it seemed to work just fine for 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 Comment

Strange... I think this ValueError appears starting Python 3.5. I have no problems when trying this with Python 3.4.3. I'm not able to find anything about this in the python 3.5 changelog though.
2

Perhaps use the NumPy/SciPy built-in, 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]])

Comments

0

I thought I encountered the same thing, but I realized I hadn't forced the array to be a float. Once, I did, it behaved as I expected. Is it possible you did something similar?

>>> 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]])

Comments

0

I had the same problem with Python 2.7 and ended up with mapping exponents to float. Can't say this is the best solution though.

np.power(10, map(lambda n: float(n), np.arange(-5, 6)))

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.