2015-06-19 259 views
2

我有两个大的(432 * 136 * 136 * 46)'numpy.ndarray'H1和H2,其中包含对应于两个模拟的高度值。当H1和H2具有相同的高度时,我想用1生成一个数组,当它们不具有相同的高度时,则为0。然后,我想知道我选择了多少个元素,所以我想计算这个矩阵元素的总和。这里是我的代码:Numpy sum函数返回1.67772e + 07

H1=np.concatenate([np.around(files1[i].hrtm()[:,0:45,:,:]/h) for i in range(0,files1.__len__())]) 
H2=np.concatenate([np.around(files2[i].hrtm()[:,0:45,:,:]/h) for i in range(0,files2.__len__())]) 

diff=np.absolute(H1-H2) 
diff[diff==0.]=np.float64(-1.) 
diff[diff!=-1]=np.float64(0.) 
diff=diff*diff 

print np.sum(diff) 

这里是我的输出,这是永远不变的,不依赖于数据:

1.67772e+07 

经过一番研究,我读了它与最大浮动的大小。我尝试了几种格式,用int,float,np.float32或者什么都替换np.float64,并且它们都给出了相同的结果。

你知道如何才能拥有真实的号码吗?

+0

它与单精度浮点数的**精度**相关:在值2^24之上,加1不会产生任何影响,因为它是绝对的rbed。 –

+1

@rth:这是一个奇怪的断言。 'diff == 0.'将给出一个数组,其中包含与True和False在其他地方相对应的位置。它将按照OP的意图工作。 –

+0

@MarkDickinson请注意,“如果'diff'是一个浮点数组”在我的评论。我错过了它被转换为带有'np.around'的整数的事实。否则,你最终可能会遇到四舍五入的问题,比如检查'2.2 * 3.0 == 6.6',它将在python中计算为False。 – rth

回答

2

diff -array的类型是H1H2的类型。由于您只增加了许多1是你可以转换diffbool

print diff.astype(bool).sum() 

或更简单

print (H1 == H2).sum() 

但由于浮点值不准确的,人们可能会测试非常小的差异:

print (abs(H1 - H2) < 1e-30).sum() 
+2

'(H1 == H2).sum()'? –

+0

这很好,非常感谢,而且这些解决方案更加优雅。 –

+1

请注意,H1和H2的值已经四舍五入到最接近的整数,所以使用容差在这里没有任何实现。 (如果这些是以英尺为单位的高度,那么'1e-30'会变得太小而无用:比较基本上是相等的。) –