Получение минимального массива из нескольких массивов по порядку в Python - PullRequest
1 голос
/ 02 марта 2012

скажи, что у меня есть 4 массива [1,2,3] [2,3,1] [3,2,1] [1,3,2]

В этом случае я определил [1,2,3] как «минимальный массив» для моих целей, так как это один из двух массивов с наименьшим значением в индексе 0, и из этих двух массивов он имеет самый низкий индекс 1. Если бы было больше массивов с подобными значениями, мне нужно было бы сравнить следующие значения индекса и т. д.

Как извлечь из кучи массив [1,2,3] в том же порядке?

Как я могу расширить это до x массивов размера n?

Спасибо

Ответы [ 3 ]

3 голосов
/ 02 марта 2012

Использование python non-numpy .sort () или sorted () в списке списков (не numpy-массивах) автоматически делает это, например:

a = [[1,2,3],[2,3,1],[3,2,1],[1,3,2]]
a.sort()

дает

[[1,2,3],[1,3,2],[2,3,1],[3,2,1]]

Кажется, что сортировка numpy только рекурсивно сортирует подмассивы, поэтому лучшим способом было бы сначала преобразовать его в список python.Предполагая, что у вас есть массив массивов, который вы хотите выбрать минимум, вы можете получить минимум как

sorted(a.tolist())[0]

Как кто-то указал, вы также можете сделать min(a.tolist()), который использует тот же тип сравнений, что и sort,и будет быстрее для больших массивов (линейное и логарифмическое асимптотическое время выполнения).

0 голосов
/ 03 марта 2012

lexsort numpy близок к тому, что вы хотите.Сначала сортируется по последнему ключу, но его легко обойти:

>>> a = np.array([[1,2,3],[2,3,1],[3,2,1],[1,3,2]])
>>> order = np.lexsort(a[:, ::-1].T)
>>> order
array([0, 3, 1, 2])
>>> a[order]
array([[1, 2, 3],
       [1, 3, 2],
       [2, 3, 1],
       [3, 2, 1]])
0 голосов
/ 02 марта 2012

Вот идея использования numpy:

import numpy

a = numpy.array([[1,2,3],[2,3,1],[3,2,1],[1,3,2]])

col = 0
while a.shape[0] > 1:
    b = numpy.argmin(a[:,col:], axis=1)
    a = a[b == numpy.min(b)]
    col += 1

print a

Это проверяет столбец за столбцом, пока не останется только одна строка.

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