您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在numpy中将负数四舍五入时如何消除多余的负号?

在numpy中将负数四舍五入时如何消除多余的负号?

介于之间-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().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通常会更容易。但是,如果您想要唯一的浮点数,那么您也应该能够做到这一点,尽管您需要做得更加谨慎。浮点数的主要问题是,您可以从计算中引入很小的差异,并且它们不会出现在法线中print,但这并不是一个巨大的障碍,尤其是在round, fix, rint合理范围的浮点数之后。

其他 2022/1/1 18:31:22 有411人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶