使用数组时,负指数和/的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 ]])
当指数为正数时,我没有这样的问题。为什么它对负指数的表现不同?
答案 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表现相同