您在-0.
和+0.
之间遇到的问题是浮点应该如何表现的规范(IEEE754)的一部分。在某些情况下,需要这种区别。例如,请参阅the docs for around
中链接的文档。
另外值得一提的是,两个零点应该比较平等的,所以
np.array(-0.)==np.array(+0.)
# True
也就是说,我认为问题更可能与你的独特性比较。例如:
a = np.array([-1., -0., 0., 1.])
np.unique(a)
# array([-1., -0., 1.])
如果你想保持这些数字作为浮点但拥有所有的零相同,你可以使用:
x = np.linspace(-2, 2, 6)
# array([-2. , -1.2, -0.4, 0.4, 1.2, 2. ])
y = x.round()
# array([-2., -1., -0., 0., 1., 2.])
y[y==0.] = 0.
# array([-2., -1., 0., 0., 1., 2.])
# or
y += 0.
# array([-2., -1., 0., 0., 1., 2.])
但是请注意,你必须要做到这一点位因为您试图避免浮点规范,所以需要额外的工作。
还要注意,这不是由于舍入错误。例如,
np.fix(np.array(-.4)).tostring().encode('hex')
# '0000000000000080'
np.fix(np.array(-0.)).tostring().encode('hex')
# '0000000000000080'
即,所得到的号码是完全一样的,但
np.fix(np.array(0.)).tostring().encode('hex')
# '0000000000000000'
是不同的。这就是为什么你的方法不起作用,因为它比较了数字的二进制表示,这对于两个零来说是不同的。因此,我认为这个问题更多的是比较浮点数的唯一性的一般思路。
的各种方法快速timeit测试:
data0 = np.fix(4*np.random.rand(1000000,)-2)
# [ 1. -0. 1. -0. -0. 1. 1. 0. -0. -0. .... ]
N = 100
data = np.array(data0)
print timeit.timeit("data += 0.", setup="from __main__ import np, data", number=N)
# 0.171831846237
data = np.array(data0)
print timeit.timeit("data[data==0.] = 0.", setup="from __main__ import np, data", number=N)
# 0.83500289917
data = np.array(data0)
print timeit.timeit("data.astype(np.int).astype(np.float)", setup="from __main__ import np, data", number=N)
# 0.843791007996
我@ senderle的观点认为,如果你想简单和详细的比较,可以与整数度日,整数一般会更容易。但是如果你想要独特的花车,你也应该能够做到这一点,尽管你需要更仔细一点。漂浮物的主要问题在于,你可以从计算中引入小的差异,并且不会出现在正常的print
中,但这不是一个巨大的障碍,并且对于合理范围的漂浮物而言不是一个巨大的障碍,尤其是round, fix, rint
之后。
尝试将0.0加到结果中。 – 2014-11-06 14:37:03
这是以前的问题吗? http://stackoverflow.com/questions/3387655/safest-way-to-convert-float-to-integer-in-python – 2014-11-06 14:54:16