Jak mogę posortować tablicę w NumPy według n-tej kolumny?
Na przykład,
a = array([[9, 2, 3],
[4, 5, 6],
[7, 0, 5]])
Chciałbym posortować wiersze według drugiej kolumny, tak aby uzyskać:
array([[7, 0, 5],
[9, 2, 3],
[4, 5, 6]])
np.sort(a, axis=0)
byłoby zadowalającym rozwiązaniem dla danej matrycy. Zasugerowałem edycję z lepszym przykładem, ale został odrzucony, chociaż w rzeczywistości pytanie byłoby o wiele bardziej jasne. Przykładem powinno być cośa = numpy.array([[1, 2, 3], [6, 5, 2], [3, 1, 1]])
z pożądaną wydajnościąarray([[3, 1, 1], [1, 2, 3], [6, 5, 2]])
Odpowiedzi:
@steve „s odpowiedź jest rzeczywiście najbardziej elegancki sposób to zrobić.
Aby uzyskać „prawidłowy” sposób, zobacz argument słowa kluczowego rzędu numpy.ndarray.sort
Musisz jednak zobaczyć tablicę jako tablicę z polami (tablica strukturalna).
„Właściwy” sposób jest dość brzydki, jeśli początkowo nie zdefiniowałeś swojej tablicy za pomocą pól ...
Jako szybki przykład posortuj go i zwróć kopię:
Aby posortować to na miejscu:
@ Steve's jest naprawdę najbardziej eleganckim sposobem na zrobienie tego, o ile wiem ...
Jedyną zaletą tej metody jest to, że argument „kolejność” to lista pól, według których należy uporządkować wyszukiwanie. Na przykład można sortować według drugiej kolumny, następnie trzeciej kolumny, a następnie pierwszej kolumny, podając kolejność = [„f1”, „f2”, „f0”].
źródło
ValueError: new type not compatible with array.
float
? Czy powinienem coś zmienić?a = np.array([['a',1,2,3],['b',4,5,6],['c',0,0,1]])
jakim podejściu powinienem się kierować?np.argsort
mogą zajmować całkiem sporo pamięci, a ponadto indeksowanie tablicą wygeneruje również kopię sortowanej tablicy.Przypuszczam, że to działa:
a[a[:,1].argsort()]
Oznacza to drugą kolumnę
a
i odpowiednio ją posortuj.źródło
1
tu jest? indeks do posortowania?[:,1]
wskazuje drugą kolumnęa
.a[a[:,1].argsort()[::-1]]
np.sort
nie?ind = np.argsort( a[:,1] ); a = a[ind]
Możesz sortować według wielu kolumn, zgodnie z metodą Steve'a Tjoa, stosując sortowanie stabilne, takie jak scalanie i sortowanie indeksów od kolumn od najmniej znaczących do najbardziej znaczących:
Sortuje to według kolumny 0, następnie 1, a następnie 2.
źródło
W przypadku, gdy ktoś chce skorzystać z sortowania w krytycznej części swoich programów, oto porównanie wydajności różnych propozycji:
Wygląda na to, że indeksowanie za pomocą argsort jest najszybszą jak dotąd metodą ...
źródło
Z wiki dokumentacji Pythona myślę, że możesz:
Dane wyjściowe to:
źródło
Z listy mailingowej NumPy , oto inne rozwiązanie:
źródło
a[np.lexsort(a.T[cols])]
. gdziecols=[1]
w pierwotnym pytaniu.Miałem podobny problem.
Mój problem:
Chcę obliczyć SVD i muszę posortować moje wartości własne w kolejności malejącej. Ale chcę zachować mapowanie między wartościami własnymi a wektorami własnymi. Moje wartości własne znajdowały się w pierwszym rzędzie, a odpowiadający mu wektor własny pod nim w tej samej kolumnie.
Chcę więc posortować tablicę dwuwymiarową pod względem kolumny według pierwszego rzędu w kolejności malejącej.
Moje rozwiązanie
Jak to działa?
a[0,]
to tylko pierwszy wiersz, według którego chcę posortować.Teraz używam argsort, aby uzyskać porządek indeksów.
Używam,
[::-1]
ponieważ potrzebuję porządku malejącego.Wreszcie używam,
a[::, ...]
aby uzyskać widok z kolumnami we właściwej kolejności.źródło
Trochę bardziej skomplikowany
lexsort
przykład - zejście na pierwszą kolumnę, a następnie wejście na drugą. Sztuczkilexsort
polegają na tym, że sortuje według rzędów (stąd.T
) i daje pierwszeństwo ostatnim.źródło
Oto inne rozwiązanie uwzględniające wszystkie kolumny (bardziej zwarty sposób odpowiedzi JJ );
Sortuj za pomocą lexsort,
Wynik:
źródło
Po prostu używając sortowania, użyj numeru koloru, na podstawie którego chcesz sortować.
źródło
To stare pytanie, ale jeśli chcesz je uogólnić na tablice o wymiarach większych niż 2, oto rozwiązanie, które można łatwo uogólnić:
Jest to przesada dla dwóch wymiarów i
a[a[:,1].argsort()]
wystarczyłaby na odpowiedź @ Steve'a, jednak odpowiedzi tej nie można uogólnić na wyższe wymiary. Możesz znaleźć tym pytaniu przykład tablicy 3D.Wynik:
źródło