【问题标题】:Get the index of a Numpy Array获取 Numpy 数组的索引
【发布时间】:2018-10-22 07:30:44
【问题描述】:

我有一个 numpy 数组:

arr = [0.23, 2.32, 4.04, 5.02, 6.84, 10.12, 10.34, 11.93,12.44]

我想获取我输入的最接近整数的索引。例如,如果我输入 10,那么我应该返回索引 5 (10.12),或者如果我输入 12,我应该返回索引 7 (11.93)。

【问题讨论】:

  • 数组是否保证排序?

标签: python arrays numpy search


【解决方案1】:

如果您的列表未排序,您将需要使用abs + argmin 的线性时间解决方案:

>>> np.abs(np.array(arr) - 12).argmin()
7

但是,如果您的列表已排序(升序或降序),您可以使用二分搜索来获得亚线性时间解决方案(非常快):

# https://ideone.com/aKEpI2 — improved by @user2357112
def binary_search(arr, val):
    # val must be in the closed interval between arr[i-1] and arr[i],
    # unless one of i-1 or i is beyond the bounds of the array.
    i = np.searchsorted(arr, val)

    if i == 0:
        # Smaller than the smallest element
        return i
    elif i == len(arr):
        # Bigger than the biggest element
        return i - 1
    elif val - arr[i - 1] <= arr[i] - val:
        # At least as close to arr[i - 1] as arr[i]
        return i - 1

    # Closer to arr[i] than arr[i - 1]
    return i

cases = [10, 12, 100, 10.12]   # 5, 7, 8, 5
print(*[binary_search(arr, c) for c in cases], sep=',')

【讨论】:

  • 你今天有点邋遢吧? searchsorted soln 给出了 10 的错误答案(4 而不是 5)。
  • 如果你想要最近的元素,你必须更加小心searchsorted。特别是,搜索0返回-1,搜索10.12无法报告10.12的索引,并且搜索数组的两个值之间的值总是选择左值的索引,即使正确的值更接近。
  • @PaulPanzer 请原谅,最近睡眠不足。让我解决这个问题,我会确保它有效。
  • “睡眠不足” --- 猜到了 ;-)
  • @PaulPanzer Done,让我知道它现在是如何形成的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
相关资源
最近更新 更多