Negative exponent with NumPy array operand

浪尽此生 提交于 2020-08-01 12:48:29

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!