2014-06-26 34 views
-1
>>> import numpy as np 
>>> a=np.arange(0,2,0.2) 
>>> a 
array([ 0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2, 1.4, 1.6, 1.8]) 
>>> a=a.tolist() 
>>> a 
[0.0, 0.2, 0.4, 0.6000000000000001, 0.8, 1.0, 1.2000000000000002, 1.4000000000000001, 1.6, 1.8] 
>>> a.index(0.6) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: 0.6 is not in list 

它出现在列表中的一些价值观已经改变,我无法与index()找到他们。我该如何解决这个问题?Python的 - 转换数组列表导致价值观改变

+0

可能重复[蟒蛇限制花车到小数点后分] (http://stackoverflow.com/questions/455612/python-limiting-floats-to-two-decimal-points) – CoryKramer

回答

5

0.6没有改变; 这是从来没有出现

>>> import numpy as np 
>>> a = np.arange(0, 2, 0.2) 
>>> a 
array([ 0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2, 1.4, 1.6, 1.8]) 
>>> 0.0 in a 
True # yep! 
>>> 0.6 in a 
False # what? 
>>> 0.6000000000000001 in a 
True # oh... 

数组中的数字四舍五入用于显示目的,但阵列真的包含您随后在列表中看到价值; 0.60000000000000010.6不能精确地表示为浮点数,因此依靠浮点数进行比较是不明智的!找到索引

一种方法是使用一个容忍的态度:

def float_index(seq, f): 
    for i, x in enumerate(seq): 
     if abs(x - f) < 0.0001: 
      return i 

将在阵列上也工作:

>>> float_index(a, 0.6) 
3 
+0

看看http://www.cygnus-software.com/papers/comparingfloats/comparingfloats。 HTM如何能够比较花车。 –

+0

@ChristianBerendt事实上,“绝对epsilon”的方法是我通常采取的。 – jonrsharpe