介于之间
-0.和之间的问题是
+0.浮点应该如何行为的规范(IEEE754)的一部分。在某些情况下,需要区别对待。例如,请参阅链接到的文档
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().enpre('hex')# '0000000000000080'np.fix(np.array(-0.)).tostring().enpre('hex')# '0000000000000080'也就是说,结果数字完全相同,但是
np.fix(np.array(0.)).tostring().enpre('hex')# '0000000000000000'是不同的。这就是您的方法无法正常工作的原因,因为它正在比较数字的二进制表示形式,这对于两个零是不同的。因此,我认为问题更多是比较方法,而不是比较浮点数唯一性的一般思想。
快速测试各种方法:
data0 = np.fix(4*np.random.rand(1000000,)-2)# [ 1. -0. 1. -0. -0. 1. 1. 0. -0. -0. .... ]N = 100data = np.array(data0)print timeit.timeit("data += 0.", setup="from __main__ import np, data", number=N)# 0.171831846237data = np.array(data0)print timeit.timeit("data[data==0.] = 0.", setup="from __main__ import np, data", number=N)# 0.83500289917data = np.array(data0)print timeit.timeit("data.astype(np.int).astype(np.float)", setup="from __main__ import np, data", number=N)# 0.843791007996我同意@senderle的观点,即如果您希望进行简单而精确的比较并且可以使用int进行比较,则int通常会更容易。但是,如果您想要唯一的浮点数,那么您也应该能够做到这一点,尽管您需要做得更加谨慎。浮点数的主要问题是,您可以从计算中引入很小的差异,并且它们不会出现在法线中
round,fix, rint合理范围的浮点数之后。



