我试图通过在4列中水平连接数据来创建一个数组,如下所示:
col1=numpy.arange(191.25,196.275,.001)[:, numpy.newaxis]
nrows=col1.shape[0]
col2=numpy.zeros((nrows,1),dtype=numpy.int)
col3=numpy.zeros((nrows,1),dtype=numpy.int)
col4=numpy.ones((nrows,1),dtype=numpy.int)
a=numpy.hstack((col1,col2,col3,col4))
然后我将其转换为字符串:
a_str = '\n'.join('\t'.join('%0.3f' %x for x in y) for y in a)+'\n'
并将其转换回2d numpy数组:
a2=numpy.array(filter(None,re.split('[\n\t]+',a_str)),dtype=float).reshape(-1,4)
但是现在当我得到FALSE,当我比较时:
a[-1,0]==a2[-1,0]
当我查看各个值时,我看到:
a[-1,0]=196.27500000002399
a2[-1,0]=196.27500000000001
是否存在与从数组转换为字符串并返回相关的一些浮点/舍入误差(a2实际上接近所需的值196.275而不是a)?如何使它值相等?我怀疑的是,当我通过迭代加法最初生成col1来产生错误时,会使后面的数组索引中的错误复杂化。这是否意味着我应该明确地枚举col1的值,或者是否有解决方法?
答案 0 :(得分:0)
从根本上说,这并不是解决方案。一般来说,有限十进制字符串和有限二进制表示没有确切的等价物。舍入错误将在此类转换中产生,而不是测试确切的等效性,必须使用像np.allclose这样的结构。
答案 1 :(得分:0)
我找到了适用于我的情况的解决方案,那就是基本上使用a2而不是a。然后,当我通过与问题中相同的过程将a2转换为字符串并返回到数组(例如,a3)时,我可以为numpy.all(a2==a3)
获得True。与a不同,a2和a3的所有值似乎都在+/- 1e-14的期望值内并且彼此相同。