如何使用np.where查找数组条目之间值的索引?

时间:2015-05-27 08:25:40

标签: python arrays numpy

假设我有一维数组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可以找到这样的索引吗?

4 个答案:

答案 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)

您可以使用argwhere和min:

np.min(np.argwhere(A==a))

请注意,仅当a位于A时才会有效。