栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在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().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通常会更容易。但是,如果您想要唯一的浮点数,那么您也应该能够做到这一点,尽管您需要做得更加谨慎。浮点数的主要问题是,您可以从计算中引入很小的差异,并且它们不会出现在法线中

print
,但这并不是一个巨大的障碍,尤其是在
round,fix, rint
合理范围的浮点数之后。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/652742.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号