gpt4 book ai didi

python - 在numpy中将负数舍入为零时如何消除多余的减号?

转载 作者:太空狗 更新时间:2023-10-29 18:26:29 27 4
gpt4 key购买 nike

我有一个关于 numpy 中的 fixfloor 函数的简单问题。当将大于 -1 的负数舍入为零时,numpy 将它们正确地舍入为零,但会留下一个负号。这个负号干扰了我的服装 unique_rows 函数,因为它使用了 ascontiguousarray比较数组的元素,这个符号扰乱了唯一性。 round 和 fix 在这方面的行为相同。

>>> np.fix(-1e-6)
Out[1]: array(-0.0)
>>> np.round(-1e-6)
Out[2]: -0.0

关于如何摆脱标志的任何见解?我考虑过使用 np.sign 函数,但它会带来额外的计算成本。

最佳答案

您在 -0.+0. 之间遇到的问题是 float 行为规范 (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.])

如果您想将数字保留为 float 但所有零都相同,您可以使用:

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'

是不同的。这就是您的方法不起作用的原因,因为它正在比较数字的二进制表示形式,这对于两个零是不同的。因此,我认为问题更多的是比较方法,而不是比较 float 唯一性的一般思路。

各种方法的快速 timeit 测试:

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 的观点,即如果您想要简单而准确的比较并且可以使用整数,那么整数通常会更容易。但是如果你想要独特的 float ,你也应该能够做到这一点,尽管你需要更小心地做。 float 的主要问题是你可以有一些小的差异,这些差异可以从计算中引入并且不会出现在正常的 print 中,但这不是一个巨大的障碍,尤其是在 round, fix, rint 以获得合理的 float 范围。

关于python - 在numpy中将负数舍入为零时如何消除多余的减号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26782038/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com