Как получить минимум определенных элементов массива с помощью Python?

Мне нужно знать минимальный элемент данных для определенных элементов в повторяющемся массиве.

У меня есть три массива dist, Q и вершина:

dist = [  0.  inf  inf  inf  inf]
vertex = [2 4 5 7 8]
Q = [2 4 5 7 8]

Массив dist — это значения вершин. Каждая итерация Q уменьшается, а dist имеет разные значения. Например:

Первая итерация:

dist = [  0.  inf  inf  inf  inf]
vertex = [2 4 5 7 8]
Q = [2 4 5 7 8]

Вторая итерация:

dist   = [  0.  4.  2.  2.  1.]
vertex = [2 4 5 7 8]
Q      = [4 5 7 8]

Третья итерация

dist =   [ 0.  4.  2.  2.  1.]
vertex = [2 4 5 7 8]
Q =      [4 5 7]

Идея состоит в том, чтобы найти минимум dist, но только доступных значений Q в vertex. В первой итерации минимум равен 0, потому что все они находятся в Q. Во второй итерации минимум 1, то есть 8 в vertex, потому что в Q нет 4 со значением 0 в dist.

Это часть алгоритма Дейкстры, в которой он находит минимум значений Q. В псевдокоде это будет:

u ← vertex in Q with min dist[u]    // Node with the least distance

Я просто использую библиотеку Numpy.

Мое решение до сих пор:

    min = np.inf
    u = 0
    for q in Q:
        if dist[self.vertex == q] <= min:
            min = dist[self.vertex == q]
            u = q

person Arturo Verbel De León    schedule 22.04.2018    source источник
comment
Конечно спасибо за совет   -  person Arturo Verbel De León    schedule 02.05.2018


Ответы (1)


Маленькая хитрость: добавьте ∞, если вершина не находится в Q:

>>> dist =   [ 0.,  4.,  2.,  2.,  1.]
>>> vertex = [2, 4, 5, 7, 8]
>>> Q =      [4, 5, 7]

>>> vertex_mask = np.array([0 if x in Q else float('inf') for x in vertex])
>>> np.min(vertex_mask+dist)
2.0
person fferri    schedule 22.04.2018
comment
Хотя боюсь у него такая же алгоритмическая сложность - person Arturo Verbel De León; 22.04.2018
comment
превратите Q в set(), и сложность уменьшится с O(m*n) до O(m log n) - person fferri; 22.04.2018