Mam listę

[[0, 3], [5, 1], [2, 1], [4, 5]]

Które wykonałem w tablicy przy użyciu numpy.array:

[[0 3]
 [5 1]
 [2 1]
 [4 5]]

Jak sortować to jak tabela? W szczególności chcę sortować przez drugą kolumnę w kolejności rosnącej, a następnie rozwiązać wszelkie więzi, mając pierwszą kolumnę posortowaną w kolejności rosnącej. Dlatego pragnę:

[[2 1]
 [5 1]
 [0 3]
 [4 5]]

Każda pomoc byłaby bardzo mile widziana!

8
Derek 16 listopad 2011, 18:47

4 odpowiedzi

Najlepsza odpowiedź

Zobacz http://docs.scipy.org/ Doc / Numpy / Reference / Generowane / Numpy.lexsort.html # numpy.lexsort

W szczególności w twoim przypadku

import numpy as np
x = np.array([[0,3],[5,1],[2,1],[4,5]])
x[np.lexsort((x[:,0],x[:,1]))]

Wyjścia

array([[2,1],[5,1],[0,3],[4,5]])
9
Andrew Marshall 16 listopad 2011, 15:01

Możesz użyć numpy.lexsort():

>>> a = numpy.array([[0, 3], [5, 1], [2, 1], [4, 5]])
>>> a[numpy.lexsort(a.T)]
array([[2, 1],
       [5, 1],
       [0, 3],
       [4, 5]])
4
Sven Marnach 16 listopad 2011, 14:54

Innym sposobem robienia tego - pokrojaj kawałki danych, które chcesz, zdobądź indeksy sortowania za pomocą ArgSort, a następnie użyj tego wyniku, aby pokroić oryginalną tablicę:

a = np.array([[0, 3], [5, 1], [2, 1], [4, 5]])

subarray = a[:,1] # 3,1,1,5

indices = np.argsort(subarray) # Returns array([1,2,0,3])

result = a[indices]

Lub wszystko za jednym razem:

a[np.argsort(a[:,1])]
2
FredL 16 listopad 2011, 14:57

Jeśli chcesz sortować tylko jedną kolumnę (np. Druga kolumna), możesz zrobić coś w rodzaju:

from operator import itemgetter
a = [[0, 3], [5, 1], [2, 1], [4, 5]]
a_sorted = sorted(a, key=itemgetter(1))

Jeśli jest więcej niż jeden klucz, użyj numpy.lexsort (), jak wskazano w innych odpowiedziach.

1
Christian Alis 16 listopad 2011, 14:58