你在-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'
是不同的.这就是为什么你的方法不起作用,因为它比较了数字的二进制表示,这对于两个零是不同的.因此,我认为问题比比较浮点数的唯一性的一般思想更多的是比较的方法.
对各种方法的快速时间测试:
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的观点,如果你想要简单而精确的比较,并且可以使用int,int将通常更容易.但是如果你想要独特的浮动,你也应该能够做到这一点,尽管你需要更仔细地做.浮动的主要问题是,您可以从计算中引入小的差异,并且不会出现在正常打印中,但这不是一个巨大的障碍,特别是不是在一个合适的范围之后,的浮标.