问题
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:
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)
回答2:
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
回答3:
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]])
回答4:
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]])
回答5:
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)))
来源:https://stackoverflow.com/questions/9887549/negative-exponent-with-numpy-array-operand