2011-01-06 21 views
3

我想通過「where」的方式找到由「arange」創建的數組中的值,但它似乎無法正常工作。這裏有一個例子:numpy 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

在此先感謝!

+0

你想要輸出什麼? – milkypostman 2011-01-06 18:40:40

+0

在與myarr相同長度的另一個陣列中 – Pep 2011-01-07 03:54:57

回答

5

注:

In [32]: repr(myarr[1]) 
Out[32]: '6.6499999999999995' 

In [33]: repr(6.65) 
Out[33]: '6.6500000000000004' 

所以float64值np.arange分配給myarr[1]是不完全是Python的使用表示6.65相同浮動。

所以,除非你真的知道你在做什麼,never test floats for equality。改用不等式:

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),)