您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – 错误的numpy平均值?

5b51 2022/1/14 8:23:25 python 字数 1888 阅读 602 来源 www.jb51.cc/python

我通常使用大量的模拟工作.有时,我需要计算粒子集的质心.我注意到在许多情况下,numpy.mean()返回的平均值是错误的.我可以弄清楚这是由于累加器的饱和.为了避免这个问题,我可以在小组粒子中将所有粒子的总和分开,但这是不舒服的.任何人都有如何以优雅的方式解决这个问题的想法? 只是为了提高你的好奇心,下面的例子产生类似于我在模拟中观察到的东西: import numpy as np a = np

概述

只是为了提高你的好奇心,下面的例子产生类似于我在模拟中观察到的东西:

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时不会发生这种情况,因此解决单精度问题应该不错.

float acc = 0;
for (int i = 0; i < 1024*1024; i++) {
    acc += 30504.00005f;
}
acc /= (1024*1024);
printf("%f\n",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("%f\n",acc);   // 30504.000000

(Live demo)

总结

以上是编程之家为你收集整理的python – 错误的numpy平均值?全部内容,希望文章能够帮你解决python – 错误的numpy平均值?所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶