对numpy数组之和的理解

时间:2015-07-15 21:41:33

标签: python arrays numpy

imgCamera.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(context, ScanAdaptor.class); ((Activity) context).startActivity(intent); } } T1是两个numpy数组,分别包含温度(开尔文,100到250之间)和压力(以帕斯卡为单位,介于700和1之间)。它们具有完全相同的形状P1这些数组的每个元素都是432*45*135*135。这是我的代码:

numpy.float32

以下是我的输出:

1  T2=T1+1.
2  P2=P1+1.

3  print np.sum(np.square(np.subtract(T2,T1)))
4  print np.sum(np.square(np.subtract(P2,P1)))

5  print ((T2-T1)-1.<1e-3).sum()
6  print ((P2-P1)-1.<1e-3).sum()

我无法理解为什么:

  • 说明3和4不会给出相同的结果,因为1.6792e+07 2.24963e+07 354294000 354294000 T2-T1都应该等于一个充满1s的P2-P1数组。
  • 指令3和4都没有给出好的结果,由指令5和6给出,等于数组中元素的数量(432*45*135*135
  • 432*45*135*135=354294000T2-T1中的某些元素不等于1.如果我在指令5和6中提高比较的精度,则可以看到。

表达式

P2-P1

提供输出:

print ((T2-T1)-1.<1e-5).sum()
print ((P2-P1)-1.<1e-5).sum()

我可以想象这些问题与精确度有关,但我不应该使用dtype 354293978 354041812 来解决这个问题。我试过了:

numpy.float32

哪个不会改变任何东西。任何的想法 ?感谢

2 个答案:

答案 0 :(得分:1)

计算大量数字的总和是一个棘手的问题,因为计算机可能无法表示具有足够精度的数字。

32位浮点只有大约7位精度。因此,如果您向较大的数字添加较小的数字,并且它们之间的比率大于2^24(≈1.7*10^7),则结果可能正是那么大的数字。因此,在进行总和时,一旦您的总和达到该值,添加+1将不再更改总和。

你可以只是使用双精度(但是结果在这个数量的值上仍会有很大的误差)。否则你将不得不使用Kahan求和算法,或者,如果没有负数,则分阶段进行求和。例如,您可以先计算每行432个数字的总和,然后计算一列中45行的总和等。

答案 1 :(得分:0)

关注@roeland行,这段代码可以解决问题:

T1=T1.astype(np.float64)
T2=T1+np.float64(1.)
P1=P1.astype(np.float64)
P2=P1+np.float64(1.)

print np.sqrt(np.sum(np.square(np.subtract(T2,T1))))
print np.sqrt(np.sum(np.square(np.subtract(P2,P1))))

提供正确的输出:

354294000.0
354294000.0