- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个关于 numpy
中的 fix
和 floor
函数的简单问题。当将大于 -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/
我的服务层有如下方法 public ModuleResponse GetModules(ModuleRequest request) { var response = new ModuleRe
我构建的工具栏与大多数工具栏一样,minHeight 设置为 actionBarSize: 但是,如果我删除这个属性,就完全没有区别了。工具栏保持其 actionBarSize,即使我删除菜单并将
我已经为 SVG 和剪辑路径苦苦挣扎了一段时间。 我正在尝试创建一个三 Angular 形剪辑路径,它将覆盖照片以给顶部一个“三 Angular 形”边缘。 我试图实现与照片完全相同的效果,但三 An
我有一个带有 2 个索引的 PostgreSQL 表。其中一个索引涵盖了 website_id 和 tweet_id 列,是一个唯一的 B 树索引。第二个索引只覆盖 website_id 列,是一个非
我是一名优秀的程序员,十分优秀!