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.
5 Answers
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
Praveen
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.
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
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]])
2 ** (-2)will give you0.25.