只是为了提高你的好奇心,下面的例子产生类似于我在模拟中观察到的东西:
import numpy as npa = np.ones((1024,1024),dtype=np.float32)*30504.00005
如果你检查最大值和最小值,你得到:
a.max() 30504.0a.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("%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平均值?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)