2016-11-28 10 views
2

Я обновил оператор проблемы, чтобы помочь решить проблему идентификации списка пар координированных координат, который имеет кратчайшее расстояние до определенной пары координат. У меня есть переменная длина 2D список/массив как следующий :Выбор индекса, который удовлетворяет условию в python

d = [[[10,10],[20,20]],[[40,40],[60,60],[20,20]],[[60,60],[20,20],[30,30],[10,10]],[[70,70],[20,20]]] 

Я хочу список индексов элемента в списке, который находится ближе всего к [80, 80].

Ответ должен быть: [1, 1, 0, 0]

Что такое лучший вещий способ сделать это? @ tom-fuller и @Skycc отметили отличный способ сделать это, но мне нужно пойти еще дальше и посмотреть на пару значений, чтобы удовлетворить это условие. Исходя из того, что было рекомендовано, я попробовал;

[i.index(min(i, key=lambda x:np.linalg.norm(x-[80,80]))) for i in d] 

Это не сработало. Я подозреваю, что функция min с итерируемым мной здесь вызывает у меня горе.

ответ

2

Вы можете использовать lambda забрать 8 из всех значений в списке, а затем получить значение, которое ближе к 0, используя min

Одиночные целые числа

d=[[1,2],[4,6,2],[6,2,3,1],[7,2]] 
closest = [] 

for x in d: 
    closest.append(x.index(min(x, key = lambda y:abs(y-8)))) 

print(closest) 
2

Использование перечня

d = [[1,2],[4,6,2],[6,2,3,1],[7,2]] 
close8 = [i.index(min(i, key=lambda x:abs(x-8))) for i in d] 
# [1, 1, 0, 0] 
+0

Спасибо и благодаря @ Томом-Фуллера, а также. Получение жадности; рассмотрите список ввода «d» следующим образом. Извините за форматирование, если оно неверно. 'd = [[[10,10], [20,20]], [[40,40], [60,60], [20,20]], [[60,60], [20, 20], [30,30], [10,10]], [[70,70], [20,20]]] В приведенном выше примере каждый самый внутренний список представляет собой координатную пару, и я хочу найти список индексов минимального расстояния от точки до неподвижной точки [80,80]. Итак, я подумал, что могу попробовать ваше решение, и я написал следующее: «[i.index (min (i, key = lambda x: numpy.linalg.norm (x- [80,80]))) для i в d] ' Это не сработало, не зная почему. –

+0

Ошибка здесь 'x- [80,80]', которую нельзя использовать - при работе со списками. Существует формула для определения точного расстояния между двумя точками, это то, что вы хотите? –

+0

Том, я хочу найти индекс пары координат, который имеет кратчайшее расстояние, учитывая, что вход представляет собой многомерную многомерную структуру данных. Ответ должен быть [1, 1, 0, 0] –

1

Вот почти векторный подход -

def closestID(a, value): 
    a = np.concatenate(d) 
    lens = np.array(list(map(len,d))) 
    r = np.abs(a-value) 
    ids = np.arange(len(lens)).repeat(lens) 
    b = np.column_stack((r,ids)) 
    startidx = np.append(0,lens[:-1].cumsum()) 
    out = np.lexsort(b.T)[startidx] - startidx 
    return out 

Пример запуск -

In [92]: d 
Out[92]: [[8, 1, 2, 7], [4, 6, 2, 8], [6, 2, 3, 8, 1], [7, 2, 10], [5, 7, 2, 6, 4]] 

In [93]: closestID(d,8) 
Out[93]: array([0, 3, 3, 0, 1]) 

In [94]: closestID(d,6) 
Out[94]: array([3, 1, 0, 0, 3]) 
1

Расстояние между двумя точками можно найти с помощью pythagarous, a2 + b2 = c2. Используя эту логику, вы хотите найти наименьшее значение c2, это можно сделать так же, как и раньше, код - это одна строка, которую я только что разделил, чтобы было легче увидеть.

Координирует

d = [[[10,10],[20,20]],[[40,40],[60,60],[20,20]],[[60,60],[20,20],[30,30],[10,10]],[[70,70],[20,20]]] 
point = [80, 80] 
closest = [] 

for List in d: 
    close = List.index(     # position 
     min(List,       # smallest 
      key = lambda p:     # lambda for each coordinate in the list 
       (point[0] - p[0]) ** 2 + # a2 
       (point[1] - p[1]) ** 2  # b2 
    ))  
    closest.append(close)     # add it to the list 

print(closest) 

В вашем контексте:

Так у вас есть список, как этот [image, image, image]

Каждое изображение содержит объекты [[object], [object, object], [object, object]]

Каждый объект имеет две точки [[[point, point]], [[point, point], [point, point]]]...

, и каждая точка имеет х и у координат, например,[10, 10]

Ваш код должен выглядеть следующим образом:

d = ... 
closest = [] 

for image in d: 
    point = # MIDPOINT of image 

    for object in image: 
     # this is the same as the code above just with List switched for object 
     close = object.index(min(object, key = lambda p: (point[0] - p[0]) ** 2 + (point[1] - p[1]) ** 2))  
     closest.append(close) 

print(closest) 
+0

Спасибо Том. Это работает. Я терял сюжет, пытаясь использовать функцию калькулятора расстояния. –

+0

Без проблем! Рад, что я мог бы помочь :) –

+0

Том, список моих программ, который служит в качестве входных данных для вашего предполагаемого понимания, имеет еще одно измерение, например ниже; 'd = [[[[53, 54]]], \t \t [[[51, 51]]], \t \t [[[39, 39]], [[53, 54]]], \t \t [[[39, 39]], [[54, 54]]], \t \t [[[54, 53]]], \t \t [[[52, 52]]] \t \t] ' Когда я применяю ваше решение, неудивительно, что он работает неправильно, потому что я представил новый тусклый. Ясно, что мое понимание списков python оставляет желать лучшего. Есть предположения? –

Смежные вопросы