【发布时间】:2015-06-19 16:40:27
【问题描述】:
我有两个大 (432*136*136*46) 'numpy.ndarray' H1 和 H2,其中包含对应于两个模拟的高度值。我想在 H1 和 H2 具有相同的高度时生成一个数组,当它们不具有相同的高度时生成 0。然后,我想知道我选择了多少个元素,所以我想计算这个矩阵的元素之和。这是我的代码:
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
经过一些研究,我了解到它与浮点数的最大大小有关。我尝试了几种格式,将 np.float64 替换为 int、float、np.float32 或什么都没有,它们都给出了相同的结果。
你知道我怎样才能得到实数吗?
【问题讨论】:
-
跟单精度浮点数的精度有关:在值2^24以上,加1没有任何作用,因为被吸收了。
-
@rth:这是一个奇怪的断言。
diff == 0.将给出一个数组,该数组在对应于零的位置包含Trues,在其他位置包含Falses。它会按照 OP 的意图工作。 -
@MarkDickinson 注意,“如果
diff是一个浮点数组”在我的评论中。我错过了使用np.around将其转换为整数的事实。否则,您可能会遇到舍入问题,例如在 python 中检查2.2 * 3.0 == 6.6的结果为False。 -
@rth:是的,当然你必须小心舍入问题。但是说
diff == 0.不会匹配零是完全错误的,即使diff具有浮点类型。 (顺便说一句,它在这里,因为np.around返回浮点 dtype 的东西。)0.0 == 0.0是True! -
是的。我说的是一般原则:测试
float1==float2是否只是在找麻烦,即使它可能在 95% 的情况下都有效。
标签: python arrays numpy floating-point floating-point-precision