【问题标题】:Search for closest value in list of lists in python [closed]在python中的列表列表中搜索最接近的值[关闭]
【发布时间】:2014-12-27 16:17:50
【问题描述】:

我有一个列表:

[[0, 2], [1, 3], [2, 5], [3, 2], [4, 5]]

和一个列表中的值,例如:[4,0]

想象这是 xy 网格,我想在列表列表中找到最接近的值。 我看过这里Find nearest value in numpy array 更确切地说是这一行:idx = np.array([np.linalg.norm(x+y) for (x,y) in array-value]).argmin()

问题在于它总结了 x+y,所以它会说 [1,3] 是最接近的,在某些情况下可能是正确的,但不是全部,在这种特定情况下 [3,2] 是更近了。

请帮忙。

【问题讨论】:

  • 那么为什么[1, 3]不是壁橱是所有情况?你能给我们提供例子吗?

标签: python arrays list numpy grid


【解决方案1】:
In [4]: arr = np.array([[0, 2], [1, 3], [2, 5], [3, 2], [4, 5]])

In [5]: value = np.array([4,0])

In [6]: np.linalg.norm(arr-value, axis=1)
Out[6]: array([ 4.47213595,  4.24264069,  5.38516481,  2.23606798,  5.        ])

In [7]: np.linalg.norm(arr-value, axis=1).argmin()
Out[7]: 3

In [8]: arr[np.linalg.norm(arr-value, axis=1).argmin()]
Out[8]: array([3, 2])

请注意,如果arr 非常大,并且您需要计算arr 中最接近许多其他点的点,则使用KDTree 更有效,因为一旦您在KDTree 中获得了数据(即需要 O(n log n) 时间),搜索最近的点只需要 O(log n) 时间。使用arr[norm(...).argmin()] 需要 O(n) 时间。

所以如果你有 scipy,你可以像这样找到最近的点:

In [22]: from scipy import spatial

In [23]: tree = spatial.KDTree(arr)

In [24]: distances, indices = tree.query([4, 0])

In [25]: tree.data[indices]
Out[25]: array([3, 2])

【讨论】:

    猜你喜欢
    • 2019-10-13
    • 1970-01-01
    • 2011-02-21
    • 2018-06-07
    • 2020-03-25
    • 2021-12-12
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多