我在Numpy遇到零运行时警告,我无法理解为什么。
我说的是掩码数组的逆(元素),并且数组的有效值都没有接近0。
在下面的公式中:exct和rpol是标量,geocentp是一个屏蔽数组(因此temp和Rearth也将被屏蔽数组)。
temp = sqrt(1. - exct ** 2. * cos(geocentp)**2.)
print temp.count()
print temp.min(), temp.max()
Rearth = rpol / temp
print Rearth.count()
print Rearth.min(), Rearth.max()
打印输出为:
5680418
0.996616 0.999921
5680418
6357.09 6378.17
然而,我收到了警告:
seviri_lst_toolbox.py:1174: RuntimeWarning: divide by zero encountered in divide
Rearth = rpol / temp
这很奇怪,对吧?掩码数组的通常行为是不分割掩码值。如果在有效值上除以零,则该值被屏蔽,但不是这种情况,因为'count()'给出了除法之前和之后的有效值的确切数量...
我迷路了...有人有想法吗?
编辑: 根据RomanGotsiy的回答,我可以通过更改蒙版数组的浮动分子来消除警告:
Rearth = rpol * np.ma.ones(geocentp.shape, dtype=np.float32) / temp
但这显然不太理想。这个矩阵(临时)创建了我的记忆。还有另一种解决方法吗?
答案 0 :(得分:0)
我建议显示警告,因为rpol
类型没有屏蔽数组。
查看我的控制台输出:
>>> import numpy as np, numpy.ma as ma
>>>
>>> x = ma.array([1., -1., 3., 4., 5., 6.])
>>> y = ma.array([1., 2., 0., 4., 5., 6.])
>>> print x/y
[1.0 -0.5 -- 1.0 1.0 1.0]
>>> # assign to "a" general numpy array
>>> a = np.array([1., -1., 3., 4., 5., 6.])
>>> print a/y
__main__:1: RuntimeWarning: divide by zero encountered in divide
[1.0 -0.5 -- 1.0 1.0 1.0]
>>>