我正在尝试从道路网络创建一个点列表。在这里,我尝试将它们的坐标放在[x,y]列表中,其项目具有浮点格式。当选择网络中的新点时,应使用列表中的现有点进行检查。如果存在,则将为网络的特征提供相同的索引,否则将向列表添加新点,并且将新的索引赋予该特征。 我知道浮点数将以不同的整数形式保存,但对于完全相同的浮点数,我仍然无法使用:
If new_point in list_of_points:
#do something
我应该使用:
for point in list_of_points:
if abs(point.x-new_point.x)<0.01 and abs(point.y-new_point.y)<0.01
#do something
这些点应该与我使用ArcGIS软件捕捉它们完全相同,当我检查软件中的坐标时它们完全相同。
我问了这个问题:
1-我认为使用“in”可以使我的代码整洁而且速度更快,而使用for循环则是一种笨拙的编码方式。
2-我想知道:这是否意味着即使完全相同的浮点数存储的方式也不同?
答案 0 :(得分:1)
检查两个浮点数之间的相等性绝不是一个好主意。但是,有内置的功能来做这样的比较。从numpy
开始,您可以使用allclose
。例如,
>>> np.allclose( (1.0,2.0), (1.00000001,2.0000001) )
True
这检查两个类似输入的数组是否在一定容差内是元素相等的。您可以使用关键字参数调整相对和绝对容差。
答案 1 :(得分:1)
任何给定的Python实现都应该始终以相同的,确定的,非随机的方式存储给定的浮点数。我不相信你可以采用相同的浮点数,输入两次,并以两种不同的方式存储它。但是我也不愿意相信你会从像ArcGIS这样的地理程序中获得精确的坐标重复,特别是如果分辨率非常小的话。浮点数学有很多方法可以弄乱你的期望,所以你不应该期望你会有相同的浮点数。在不同的机器和不同的版本之间,你会得到更多错误的可能性。
如果您担心代码的优雅,可以创建一个函数来抽象出for
循环。
def coord_in(coord, coord_list):
for other_coord in coord_list:
if abs(coord.x-other_coord.x)<0.00001 and abs(coord.y-other_coord.y)<0.00001:
return True
return False
答案 2 :(得分:1)
旧线程但帮助我使用列表理解开发自己的解决方案。因为使用==
来比较两个浮点数当然不是一个好主意。以下内容返回输入列表的所有元素的索引列表,这些元素合理地接近我们正在寻找的值。
def findFloats(listOfFloats, value):
return [i for i, number in enumerate(listOfFloats)
if abs(number-value) < 0.00001]
答案 3 :(得分:0)
对于大量的点,numpy总是会更快(并且perhapd更优雅)。如果您已将x和y坐标分隔为(浮点)数组arrx和arry:
numpy.sometrue((arrx-point.x)**2+(arry-point.y)**2<tol**2)
如果点在现有点的距离tol之内,将返回True。
答案 4 :(得分:0)
2:完全相同的文字(例如,&#34; 2.3&#34;)将被存储为与给定平台和数据类型完全相同的浮点表示,但一般来说它取决于位 - ness,endian-ness以及用于制作python的编译器。
在比较数字时要确定,你至少应该精确到最精确数字的精度,或者(更好)做你在这里做的事情。
>>> 1==1.00000000000000000000000000000000001
True