Python numpy顺序依赖吗?
我注意到Python numpy顺序依赖吗?,python,numpy,floating-point,Python,Numpy,Floating Point,我注意到numpy.mean()和numpy.var()的输出随着其参数顺序的变化而变化 这只与浮点数的精度有关,否则我会错过什么 import numpy l1 = [1.0, 0.69, 0.65, 0.7, 0.64, 0.8] l2 = [1.0, 0.7, 0.69, 0.65, 0.64, 0.8] assert sorted(l1) == sorted(l2) print repr(numpy.mean(l1)) print repr(numpy.mean(l2)) pri
numpy.mean()
和numpy.var()
的输出随着其参数顺序的变化而变化
这只与浮点数的精度有关,否则我会错过什么
import numpy
l1 = [1.0, 0.69, 0.65, 0.7, 0.64, 0.8]
l2 = [1.0, 0.7, 0.69, 0.65, 0.64, 0.8]
assert sorted(l1) == sorted(l2)
print repr(numpy.mean(l1))
print repr(numpy.mean(l2))
print repr(numpy.var(l1))
print repr(numpy.var(l2))
这里是我获得的输出:
0.7466666666666667
0.74666666666666659
0.015522222222222222
0.015522222222222224
NumPy使用(在本例中)64位浮点。不能以无限精度表示所有数字。
此数据类型可以容纳15位有效数字。这意味着你的号码中的最后一个数字是没有意义的。
因此,要比较我们的数字,请使用numpy.allclose
:
>>> numpy.allclose(numpy.mean(l1), numpy.mean(l2))
True
浮点加法是交换的,但不是结合的,所以加法的顺序很重要。对于一个更极端的例子,请尝试
l1=[1e17,3.0,-1e17]
和l2=[1e17,-1e17,3.0]
,它们分别计算了0.0
和1.0
的平均值。(顺便说一句,这两个结果将无法通过Mike Müller提到的allclose
测试。)