python – 错误的numpy平均值?
发布时间:2020-12-16 23:41:55 所属栏目:Python 来源:网络整理
导读:我通常使用大量的模拟工作.有时,我需要计算粒子集的质心.我注意到在许多情况下,numpy.mean()返回的平均值是错误的.我可以弄清楚这是由于累加器的饱和.为了避免这个问题,我可以在小组粒子中将所有粒子的总和分开,但这是不舒服的.任何人都有如何以优雅的方式解
我通常使用大量的模拟工作.有时,我需要计算粒子集的质心.我注意到在许多情况下,numpy.mean()返回的平均值是错误的.我可以弄清楚这是由于累加器的饱和.为了避免这个问题,我可以在小组粒子中将所有粒子的总和分开,但这是不舒服的.任何人都有如何以优雅的方式解决这个问题的想法?
只是为了提高你的好奇心,下面的例子产生类似于我在模拟中观察到的东西: import numpy as np a = np.ones((1024,1024),dtype=np.float32)*30504.00005 如果你检查最大值和最小值,你得到: a.max() 30504.0 a.min() 30504.0 但是,平均值是: a.mean() 30687.236328125 你可以弄清楚这里出了什么问题.使用dtype = np.float64时不会发生这种情况,因此解决单精度问题应该不错. 解决方法
这不是NumPy问题,它是一个浮点问题. C中也是如此:
float acc = 0; for (int i = 0; i < 1024*1024; i++) { acc += 30504.00005f; } acc /= (1024*1024); printf("%fn",acc); // 30687.304688 (Live demo) 问题是浮点精度有限;随着累加器值相对于添加到其中的元素的增长,相对精度会下降. 一种解决方案是通过构造加法器树来限制相对增长.这是C中的一个例子(我的Python不够好……): float sum(float *p,int n) { if (n == 1) return *p; for (int i = 0; i < n/2; i++) { p[i] += p[i+n/2]; } return sum(p,n/2); } float x[1024*1024]; for (int i = 0; i < 1024*1024; i++) { x[i] = 30504.00005f; } float acc = sum(x,1024*1024); acc /= (1024*1024); printf("%fn",acc); // 30504.000000 (Live demo) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |