Python 获取Numpy数组的索引

Python 获取Numpy数组的索引,python,arrays,numpy,search,Python,Arrays,Numpy,Search,我有一个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)。如果您的列表没有排序,您将需要使用abs+argmin: >>> np.abs(np.array(arr) - 12).argmin() 7 但是,如果列表已排序(升序或降序

我有一个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)。

如果您的列表没有排序,您将需要使用
abs
+
argmin

>>> np.abs(np.array(arr) - 12).argmin()
7
但是,如果列表已排序(升序或降序),则可以使用二进制搜索来获得次线性时间解决方案(非常快):


数组保证排序吗?你今天有点马虎,不是吗?
searchsorted
soln为
10
4
而不是
5
)给出了错误的答案。如果需要最近的元素,您必须对
searchsorted
更加小心。特别是,搜索
0
返回
-1
,搜索
10.12
无法报告
10.12
的索引,并且搜索数组的两个值之间的值总是选择左值的索引,即使右值更接近。@PaulPanzer,请原谅,最近一直睡眠不足。让我来解决这个问题,我会确保它能正常工作。“一直睡眠不足”--猜得差不多;-)@保尔:装甲车完成了,让我知道它现在是怎么形成的。
# 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=',')