Negative exponent with NumPy array operand

standard power ( **

) work in Python does not work for negative power! Of course, I could write the formula differently, with difference and positive force. Nevertheless, I check the result of the optimization procedure, and sometimes the cardinality is negative, sometimes it is positive. Here again if statement can be executed, but I'm wondering if there is workarouns and a Python library where negative exposure is allowed. Thanks and regards.

+3


source to share


5 answers


What version of python are you using? Works great 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)

      

+3


source


It might be a Python 3 thing, since I am using 3.5.1 and I believe this is your fault ...

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 float and it will 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 basic 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 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


source


Maybe use the built-in power of NumPy / SciPy,

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

      

+1


source


I thought I ran into the same thing, but I figured out that I didn't force the array to be float. One day, I did, he behaved as I expected. Is it possible that you did something like this?

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

      

0


source


I had the same problem with Python 2.7 and ended up able to match metrics for floats. I cannot say that this is the best solution.

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

      

0


source







All Articles