python'in'运算符返回错误的值

时间:2014-02-03 22:48:08

标签: python

我遇到了一个奇怪的问题' in' python的运算符,它是从下面的ipython shell复制而来的:

    In [119]: Teff = 10000

    In [120]: loggs = numpy.arange(4.5, 4*numpy.log10(Teff) - 15.02, -0.1)

    In [121]: 4.0 in loggs
    Out[121]: False

    In [122]: loggs
    Out[122]: 
    array([ 4.5,  4.4,  4.3,  4.2,  4.1,  4. ,  3.9,  3.8,  3.7,  3.6,  3.5,
    3.4,  3.3,  3.2,  3.1,  3. ,  2.9,  2.8,  2.7,  2.6,  2.5,  2.4,
    2.3,  2.2,  2.1,  2. ,  1.9,  1.8,  1.7,  1.6,  1.5,  1.4,  1.3,
    1.2,  1.1,  1. ])

正如您所看到的,4.0在数组中,但是' in'运算符返回False。我和#4;'尝试了同样的事情。 (整数)和' 4.',两者都有相同的结果。与该数组中的其他值相同(如3.9)。有任何想法吗?我正在运行python 2.7.1,numpy版本为1.7.0。

我看到一个previous post很接近,但对于'中发生的事情,从来没有一个好的答案。

3 个答案:

答案 0 :(得分:7)

问题是4.0不在数组中。一个非常接近4.0的值,但略微偏离(由于浮点不准确)在数组中,当您打印它时,打印例程将四舍五入为“4.0”以进行显示。

如果打印出实际元素(loggs[5]),python将以更高的精度打印,您会看到该值实际上略高于4.0(约4.0000000000000018)。

我建议您阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic了解详情。

答案 1 :(得分:0)

实际上4.0不在你的数组中,如果你想看到数组的真值,你可以写:

loggs.tolist()

你会看到这些值,所以如果你想检查4.0,你需要做这样的事情:

new_loggs = [round(i,2) for i in loggs.tolist()]
4.0 in new_loggs

输出:True

答案 2 :(得分:-1)

用于循环带有条件的矩阵或要从矩阵获得的范围。

import numpy as np
Teff = 10000
loggs = np.arange(4.5, 4*np.log10(Teff) - 15.02, -0.1)
print loggs
for i in loggs:
    if i > 3.9:
        print i

输出: 4.5 4.4 4.3 4.2 4.1 4 3.9