Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python np.arange';这是一种奇怪的行为_Python_Numpy_Precision - Fatal编程技术网

Python np.arange';这是一种奇怪的行为

Python np.arange';这是一种奇怪的行为,python,numpy,precision,Python,Numpy,Precision,我试图为N个离散分数的分布创建一个N+1个箱子的数组 我想numpy的arange可以用于此。但是,该函数给我提供了奇数值,这对生成的numpy直方图有显著影响。下面是一个简单的例子: n = 10 a = np.arange(0, 1.01 + 1/n, 1/n) print(a) for i in a: print(i) 事实上,仅仅打印数组输出看似正常的值是额外的误导。如果我想将此数组用作numpy的histogram()函数的bins参数,这是一个大问题,因为我的值是k/1

我试图为N个离散分数的分布创建一个N+1个箱子的数组

我想numpy的
arange
可以用于此。但是,该函数给我提供了奇数值,这对生成的numpy直方图有显著影响。下面是一个简单的例子:

n = 10
a = np.arange(0, 1.01 + 1/n, 1/n)

print(a)
for i in a:
    print(i)

事实上,仅仅打印数组输出看似正常的值是额外的误导。如果我想将此数组用作numpy的
histogram()
函数的
bins
参数,这是一个大问题,因为我的值是k/10小数。特别是,值为0.7的所有数据点都将放在
[0.600000000000001,0.70000000000001]
bin中,而根据np.histogram()文档,我希望它们位于
[0.7,0.8]


问题是这是一个bug还是一个特性。

问题是很难将某些十进制精确地表示为二进制浮点数-因此它们被转换为足够接近的浮点数

如果打印它们时未设置明确的精度限制,它们可能会转换为与预期数字稍有不同的十进制表示形式


要将精度设置为例如5个小数点,请使用
print(“{.5g}.”格式(i))

这与numpy完全无关,这些数字的二进制表示在计算机世界中并不精确

例如,0.3不能用有限的数字表示。这就是为什么你会得到这些结果,这些结果接近你的预期,但并不完全正确

当您看到以下内容时,您会感到惊讶:

>>> print('{:.50}'.format(0.3))
0.2999999999999999888977697537484345957636833190918

可能更适合这种情况,例如
np.linspace(0,1.1,12)
。还可以使用指定小数位数。在任何情况下,如果小数精度对你来说非常重要,你可以考虑将数据乘以10,舍入和使用整数。@ DavIDG可能是,但什么是一个很好的方法来解决一般化的装箱问题?@ DavIDG他们有相同的答案(因为他们处理相同的效果),但是它们是不同的-您链接的问题是关于浮点运算的
0.1+0.2==0.3
@jdehesa谢谢。我想主要的问题是我的数据点没有以相同的方式表示。尽管如此,我只是在二进制向量上使用np.mean()来获得我的分数。所以我猜是np.mean,或者np.sum(a)/N,对输出进行隐式四舍五入?“额外问题”应该作为一个单独的问题提出,是的,有一个解决方案。
>>> print('{:.50}'.format(0.3))
0.2999999999999999888977697537484345957636833190918