Эффективный способ получить значение индекса - PullRequest
2 голосов
/ 06 ноября 2019

У меня есть список кортежей со значениями x, y. Я хотел бы найти индекс ближайшего значения х в списке. Ниже приведен мой код.

# list of coords
a = [(376, 220), (350, 218), (324, 216), (298, 214), (271, 211), (245, 210), (219, 208), (192, 205), (166, 204)]
to_find = (190, 210)

#grab a new list with only x axis elements
lst = []
for i in range(len(a)):
    lst.append(a[i][0])

#list of all x coordinates
print(lst)

#find the min closest element
def min_closest(lst, K):
    return lst[min(range(len(lst)), key=lambda i: abs(lst[i] - K))]

#print the corresponding index
print(lst.index(min_closest(lst, to_find[0])))

Я сформулировал новый список со значениями x. Наконец, я сравнил значение x списка поиска со списком x, чтобы найти ближайший возможный элемент. Позже я схватил свой указатель. Есть ли эффективный способ сделать это?

Ответы [ 3 ]

3 голосов
/ 06 ноября 2019

Вы сделали все это, но сделали дополнительный шаг:

a = [(376, 220), (350, 218), (324, 216), (298, 214), (271, 211), (245, 210), (219, 208), (192, 205), (166, 204)]
to_find = (190, 210)

ix = min(range(len(a)), key = lambda x: abs(a[x][0] - to_find[0]))
print(ix)

Вывод:

7

Другой способ, вероятно, будет быстрее:

a = [(376, 220), (350, 218), (324, 216), (298, 214), (271, 211), (245, 210), (219, 208), (192, 205), (166, 204)]
to_find = (190, 210)

min_diff, min_ix = 999999999, None
for ix, value in enumerate(a):
    diff = abs(to_find[0] - value[0])
    if diff < min_diff:
        min_diff, min_ix = diff, ix
print(min_ix)
2 голосов
/ 06 ноября 2019

Преобразуйте a в numpy.array, а затем используйте np.argmin:

arr = np.array(a)
diffs = np.abs(arr - to_find)
arr[np.argmin(diffs[:, 0])]
#OUTPUT array([192, 205])
1 голос
/ 06 ноября 2019

Попробуйте использовать scipy.spatial.distance.euclidean:

from scipy.spatial.distance import euclidean
a = [(376, 220), (350, 218), (324, 216), (298, 214), (271, 211), (245, 210), (219, 208), (192, 205), (166, 204)]
to_find = (190, 210)
print(min(a, key = lambda x: euclidean(x, to_find)))

Вывод:

(192, 205)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...