【发布时间】:2013-09-19 21:20:57
【问题描述】:
我有一个 2 元素列表的嵌套列表(纬度/经度坐标)
xlist = [[-75.555476, 42.121701],
[-75.552684, 42.121725],
[-75.55268, 42.122023],
[-75.55250199999999, 42.125071999999996],
[-75.552611, 42.131277] ... ]
我想转换成一个集合。但是,在进行转换之前,我真的想将这些值四舍五入到较低的精度,以便我可以对其他类似列表执行集合操作并查找两个列表共有的点。
我可以用 numpy 进行四舍五入,
x = np.round( xlist, decimals = 4 )
array([[-75.5555, 42.1217],
[-75.5527, 42.1217],
[-75.5527, 42.122 ],
...,
[-75.5552, 42.1086],
[-75.5553, 42.1152],
[-75.5555, 42.1217]])
但结果对象是一个 numpy 数组,我无法将其转换为集合
s = set( x )
TypeError: unhashable type: 'numpy.ndarray'
我尝试将数组转换回元组的元组
t = ( tuple( row ) for row in x )
但这会对转换的精度造成不利影响
t.next()
(-75.555499999999995, 42.121699999999997)
我也试过一步完成,但没有运气
map( tuple, np.round( x, decimals =5 ) )
[(-75.555480000000003, 42.121699999999997),
(-75.552679999999995, 42.121720000000003),
(-75.552679999999995, 42.122019999999999),
(-75.552499999999995, 42.125070000000001)]
在元组和数组之间进行转换有什么遗漏吗?如何从列表中获取其项目四舍五入到较低精度的集合?
是否建议使用带有浮动元素的集合?
【问题讨论】:
-
您会看到
repr的结果,它显示了重新创建精确二进制表示所需的尽可能多的数字。不可能比这更接近。如果你改用str,值会更好看。 -
P.S.它与元组和数组之间的转换无关。
-
你可以证明,因此:
print (x[0][0]) -
啊哈,这只是打印语句的格式!谢谢大家,我现在感觉很笨......
-
P.P.S.我通常不建议在一组中使用
floats,因为它们两个之间的精确表示可能不一样,但如果它们都一致地四舍五入,你应该没问题。