numpy arange 和 where
我正在尝试通过“where”来查找一个由“arange”创建的数组中的值,但似乎效果不太好。这里有一个例子:
from numpy import arange, where
myarr = arange(6.6,10.25,0.05)
for item in [6.6,6.65,6.7,6.8,6.9,6.95,7.95,8.0,8.1,8.15,6.2,6.25,6.35]:
print where(myarr == item)
(array([0]),)
(array([], dtype=int32),)
(array([], dtype=int32),)
(array([], dtype=int32),)
(array([], dtype=int32),)
(array([], dtype=int32),)
(array([], dtype=int32),)
(array([], dtype=int32),)
(array([], dtype=int32),)
(array([], dtype=int32),)
(array([], dtype=int32),)
(array([], dtype=int32),)
(array([], dtype=int32),)
我使用的是Python 2.5.4和Numpy 1.3.0
提前谢谢你们!
1 个回答
6
注意:
In [32]: repr(myarr[1])
Out[32]: '6.6499999999999995'
In [33]: repr(6.65)
Out[33]: '6.6500000000000004'
所以,np.arange
给 myarr[1]
赋的这个 float64 值,和 Python 用来表示 6.65
的那个 float 值并不完全相同。
因此,除非你真的很清楚自己在做什么,否则不要用等于来比较浮点数。可以用不等式来代替:
def near(a,b,rtol=1e-5,atol=1e-8):
try:
return np.abs(a-b)<(atol+rtol*np.abs(b))
except TypeError:
return False
myarr = np.arange(6.6,10.25,0.05)
for item in [6.6,6.65,6.7,6.8,6.9,6.95,7.95,8.0,8.1,8.15,6.2,6.25,6.35]:
print (np.where(near(myarr,item)))
# (array([0]),)
# (array([1]),)
# (array([2]),)
# (array([4]),)
# (array([6]),)
# (array([7]),)
# (array([27]),)
# (array([28]),)
# (array([30]),)
# (array([31]),)
# (array([], dtype=int32),)
# (array([], dtype=int32),)
# (array([], dtype=int32),)