【问题标题】:Rounding issues when converting between arrays and tuples在数组和元组之间转换时的舍入问题
【发布时间】: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,因为它们两个之间的精确表示可能不一样,但如果它们都一致地四舍五入,你应该没问题。

标签: python numpy set


【解决方案1】:

我认为您的问题的核心是您无法使用 2D 列表创建集合...试试这个:

xlist = [[-75.555476, 42.121701],
[-75.552684, 42.121725],
[-75.55268, 42.122023],
[-75.55250199999999, 42.125071999999996],
[-75.552611, 42.131277]]

x = []
for i in xlist:
    x.append( [round(i[0],4) , round(i[1],4)] )

s = map(set,x)

【讨论】:

    【解决方案2】:

    你说你想要精确的小数,浮点数不适合你?

    这是decimal.Decimal的工作!

    >>> four_digits=decimal.Decimal('.0001')
    >>> x = tuple(tuple(decimal.Decimal(x).quantize(four_digits) for x in sub) for sub in xlist)
    >>> x
    ((Decimal('-75.5555'), Decimal('42.1217')), (Decimal('-75.5527'), Decimal('42.1217')),(Decimal('-75.5527'), Decimal('42.1220')), (Decimal('-75.5525'), Decimal('42.1251')), (Decimal('-75.5526'), Decimal('42.1313')))
    >>> set(x)
    set([(Decimal('-75.5525'), Decimal('42.1251')), (Decimal('-75.5526'), Decimal('42.1313')), (Decimal('-75.5527'), Decimal('42.1217')), (Decimal('-75.5555'), Decimal('42.1217')), (Decimal('-75.5527'), Decimal('42.1220'))])
    

    如果您愿意,您可以稍后转换回浮点数,或者您可以将它们保存在 Decimal 中,直到您打印或存储它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 2019-10-07
      • 1970-01-01
      • 2022-10-02
      相关资源
      最近更新 更多