python去掉数字最后的零_python – 如何消除额外的负号,将数字四舍五入为零时,以numpy为单位?...

博客探讨了在Python中处理浮点数-0和+0时的规范问题,以及如何在比较中保持唯一性。内容涉及IEEE754标准,浮点数的二进制表示,以及在数组中去除重复的零。提到了np.unique和np.fix等函数的用法,并对比了几种处理方法的时间效率。此外,还讨论了在特定情况下需要考虑的舍入误差和浮点数比较的挑战。
摘要由CSDN通过智能技术生成

你在-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将通常更容易.但是如果你想要独特的浮动,你也应该能够做到这一点,尽管你需要更仔细地做.浮动的主要问题是,您可以从计算中引入小的差异,并且不会出现在正常打印中,但这不是一个巨大的障碍,特别是不是在一个合适的范围之后,的浮标.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值