假设我有一维数组A,
A = [0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.51, 1.52, 1.6, 2, 3, 4, 5, 6, 7, 8, 9, 10]
我有一个值a = 1.5,我需要找到该值适合数组的条目的最小索引。在这种情况下,它应该是5。
import numpy as np
A = np.array([0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.51, 1.52, 1.6, 2, 3, 4, 5, 6, 7, 8, 9, 10])
a = 1.5
print A[np.where(A >= a >= A)]
我知道这不行,但是np.where可以找到这样的索引吗?
答案 0 :(得分:4)
假设A
已排序,您可以在O(log n)时间内使用np.searchsorted
执行此操作(A
可以是数组或列表):
>>> A = [0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.51, 1.52, 1.6, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> np.searchsorted(A, 1.5)
5
答案 1 :(得分:1)
您基本上会查找值大于或等于您尝试插入的最小索引。
这样做的一种方法是通过调用min
,但条件是如果值超出最后一个元素,则需要处理空数组:
>>> import numpy as np
>>> A = np.array([0, 0.1, 0.2, 0.3, 0.4, 0.5, 1, 2, 3, 4, 5])
>>> min(np.append(np.where(A >= -1)[0],len(A))
0
>>> min(np.append(np.where(A >= 0)[0],len(A))
0
>>> min(np.append(np.where(A >= 0.01)[0],len(A))
1
>>> min(np.append(np.where(A >= 3.5)[0],len(A))
9
>>> min(np.append(np.where(A >= 999)[0],len(A))
11
在所有情况下,它都会为您提供之前需要插入的元素的索引(如果需要附加到列表中,则为最高索引之外的索引)。
答案 2 :(得分:1)
bisect module正是这样做的(在O(log n)
时间内):
>>> from bisect import bisect_left
>>> bisect_left(A, 1.5)
5
答案 3 :(得分:0)