当指数为负数时,为什么numpy.power在数组上不依赖于元素?

时间:2014-02-04 14:14:36

标签: python arrays numpy

使用数组时,负指数和/的numpy.power或**有什么区别?为什么numpy.power不按照documentation中的描述进行元素操作。

例如,使用python 2.7.3:

>>> from __future__ import division
>>> import numpy as np   
>>> A = arange(9).reshape(3,3)
>>> A
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

当指数为负时,**和numpy.power似乎不是按行为元素

>>> A**-1
array([[-9223372036854775808,                    1,                    0],
       [                   0,                    0,                    0],
       [                   0,                    0,                    0]])
>>> np.power(A, -1)
array([[-9223372036854775808,                    1,                    0],
       [                   0,                    0,                    0],
       [                   0,                    0,                    0]])

然而/是以元素为单位的

>>> 1/A
array([[        inf,  1.        ,  0.5       ],
       [ 0.33333333,  0.25      ,  0.2       ],
       [ 0.16666667,  0.14285714,  0.125     ]])

当指数为正数时,我没有这样的问题。为什么它对负指数的表现不同?

2 个答案:

答案 0 :(得分:5)

这主要是一个铸造问题。操作员自然会认为您不希望将数字转换为其他类型。 2**-1与整数的最接近值为0,可以验证int(2**-1) >>>0

首先创建A类型的数组int

A = np.arange(9).reshape(3,3)
>>> A.dtype
dtype('int64')

将数组A复制到A_float类型float

>>> A_float = A.astype(float)
>>> A_float.dtype
dtype('float64')

在两者上运行**-1操作:

>>> A_float**-1
array([[        inf,  1.        ,  0.5       ],
       [ 0.33333333,  0.25      ,  0.2       ],
       [ 0.16666667,  0.14285714,  0.125     ]])

>>> A**-1
array([[-9223372036854775808,                    1,                    0],
       [                   0,                    0,                    0],
       [                   0,                    0,                    0]])

观察numpy并不会自动假设您希望以float形式完成此操作,并尝试使用整数来完成此操作。如果在任一操作数中表示浮点数,则由于“安全”的转换规则,您将获得浮点输出:

>>> A**-1.0
array([[        inf,  1.        ,  0.5       ],
       [ 0.33333333,  0.25      ,  0.2       ],
       [ 0.16666667,  0.14285714,  0.125     ]])

另一个选择是强制np.power将操作转换为float:

>>> np.power(A,-1,dtype=float)
array([[        inf,  1.        ,  0.5       ],
       [ 0.33333333,  0.25      ,  0.2       ],
       [ 0.16666667,  0.14285714,  0.125     ]])

我不确定为什么要使用1/A获取浮点结果。 1.0/A工作正常。

答案 1 :(得分:2)

**或np.power正在运行,但正在执行整数除法。此外,在ipython中执行相同的操作会导致RuntimeWarning为零分割。

RuntimeWarning: divide by zero encountered in true_divide

现在,我们可以通过将操作数转换为float数组来将相同的操作转换为浮点数

A = np.array([[0., 1., 2.], [3., 4., 5.], [6., 7., 8.]])

然后,1 /,**和np.power表现相同