我遇到了一个奇怪的问题' 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很接近,但对于'中发生的事情,从来没有一个好的答案。
答案 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