像numpy.random.uniform()
这样的函数返回两个边界之间的浮点数值,包括第一个边界但是不包括最高边界。也就是说,numpy.random.uniform(0,1)
可能产生0,但永远不会产生1。
我正在使用一个处理这些数字的函数,但有时会返回超出范围的结果。我可以使用numpy.clip()
将超出范围的值裁剪到0-1,但不幸的是,这个限制是包括最高数的。
如何在Python中指定“比1略小的数字”?
像numpy.random.uniform()
这样的函数返回两个边界之间的浮点数值,包括第一个边界但是不包括最高边界。也就是说,numpy.random.uniform(0,1)
可能产生0,但永远不会产生1。
我正在使用一个处理这些数字的函数,但有时会返回超出范围的结果。我可以使用numpy.clip()
将超出范围的值裁剪到0-1,但不幸的是,这个限制是包括最高数的。
如何在Python中指定“比1略小的数字”?
如果你正在使用numpy,那么可以简单地使用numpy.nextafter函数:
>>> import numpy
>>> numpy.nextafter(1, 0)
0.99999999999999989
>>> import sys
>>> 1-sys.float_info.epsilon
0.9999999999999998
>>> numpy.nextafter(1, 0) - (1-sys.float_info.epsilon)
1.1102230246251565e-16
>>> numpy.nextafter(1, 0) > (1-sys.float_info.epsilon)
True
顺便提一下,支持@Robert Kern的观点,有时候random.uniform会包括上限,而不仅仅是(0,1)之外的某些输入:
>>> import random, numpy
>>> numpy.nextafter(0,1)
4.9406564584124654e-324
>>> random.uniform(0, numpy.nextafter(0,1))
0.0
>>> random.uniform(0, numpy.nextafter(0,1))
0.0
>>> random.uniform(0, numpy.nextafter(0,1))
4.9406564584124654e-324
[我认为也许有更好的方法来解决这个问题。]
numpy.nextafter(1, 0) == (1-sys.float_info.epsilon)
不成立呢?是因为浮点数的密度取决于其大小吗? - wim在大多数实际情况下,您不需要无限小,可以进行近似。因此,对于您的示例,我将使用0.9999999而不是1.0。
numpy.random.uniform(0,1)
有时会返回一个等于1的数字吗?如果是这样,那好吧,我并不在乎这个悖论,但我希望我的修改后被削减的数字能够保证与原始数字处于相同的范围内。 - mattdm