kzen.dev
  • Fragen
  • Tags
  • Benutzer
Benachrichtigungen
Belohnungen
Registrierung
Sobald Sie sich registriert haben, werden Sie über Antworten und Kommentare zu Ihren Fragen informiert.
Einloggen
Wenn Sie bereits ein Konto haben, melden Sie sich an, um neue Benachrichtigungen zu prüfen.
Es wird Belohnungen für hinzugefügte Fragen, Antworten und Kommentare geben.
Mehr
Quelle
Bearbeiten
Anonymer Benutzer
Frage

Sortieren von Arrays in NumPy nach Spalten

Wie kann ich ein Array in NumPy nach der n-ten Spalte sortieren?

Zum Beispiel,

a = array([[9, 2, 3],
           [4, 5, 6],
           [7, 0, 5]])

Ich möchte Zeilen nach der zweiten Spalte sortieren, so dass ich zurückkomme:

array([[7, 0, 5],
       [9, 2, 3],
       [4, 5, 6]])
291 2010-05-13T15:32:57+00:00 9
Paul Wintz
Paul Wintz
Bearbeitete Frage 20. April 2018 в 7:05
Programmierung
sorting
arrays
python
numpy
scipy
Beliebte Videos
Slicing Operation in NumPy Array | Python Tutorials
Slicing Operation in NumPy Array | Python Tutorials
vor 3 Jahren
Introduction to Numpy (Part-7) | Array Sorting
Introduction to Numpy (Part-7) | Array Sorting
vor 4 Jahren
Numpy Array: Append, Insert, Delete, Sort and Flip Methods
Numpy Array: Append, Insert, Delete, Sort and Flip Methods
vor 1 Jahr
Reshaping & Indexing NumPy Arrays - Learn NumPy Series
Reshaping & Indexing NumPy Arrays - Learn NumPy Series
vor 3 Jahren
Indexing Operation in NumPy Arrays | Python Tutorials
Indexing Operation in NumPy Arrays | Python Tutorials
vor 3 Jahren
Understanding the use of any() and all() in NumPy arrays
Understanding the use of any() and all() in NumPy arrays
vor 3 Jahren
Advanced Indexing Operation in NumPy Arrays | Python Tutorials
Advanced Indexing Operation in NumPy Arrays | Python Tutorials
vor 3 Jahren
NumPy verstehen #02 - N-Dimensionale Arrays
NumPy verstehen #02 - N-Dimensionale Arrays
vor 3 Jahren
148. Excel-VBA: Der intelligente Array - eine ArrayList füllen, sortieren, drehen und ausgeben
148. Excel-VBA: Der intelligente Array - eine ArrayList füllen, sortieren, drehen und ausgeben
vor 2 Jahren
Python numpy/ array & asarray
Python numpy/ array & asarray
vor 2 Jahren
SPLITTING ARRAY (SPLIT( ),ARRAY_SPLIT( ),VSPLIT( ),HSPLIT( )) IN NUMPY - PYTHON PROGRAMMING
SPLITTING ARRAY (SPLIT( ),ARRAY_SPLIT( ),VSPLIT( ),HSPLIT( )) IN NUMPY - PYTHON PROGRAMMING
vor 2 Jahren
NumPy Sort and Argsort -- The Ultimate Introduction
NumPy Sort and Argsort -- The Ultimate Introduction
vor 3 Jahren
How to use Numpy Array Sorting &  Filtering
How to use Numpy Array Sorting & Filtering
vor 2 Jahren
NumPy Indexing and Slicing Arrays, Boolean Mask Arrays ,  Numpy Python Data Science
NumPy Indexing and Slicing Arrays, Boolean Mask Arrays , Numpy Python Data Science
vor 4 Jahren
« Zurück
Vor »
Steve Tjoa
Steve Tjoa
13. Mai 2010 в 3:39
2010-05-13T15:39:39+00:00
Mehr
Quelle
Bearbeiten
#10449796

Ich nehme an, das funktioniert: "a[a[:,1].argsort()]`

Dies zeigt die zweite Spalte von "a" an und sortiert sie entsprechend.

 makis
makis
Bearbeitete Antwort 10. Dezember 2018 в 10:17
649
0
Lösung / Antwort
Joe Kington
Joe Kington
13. Mai 2010 в 4:10
2010-05-13T16:10:17+00:00
Mehr
Quelle
Bearbeiten
#10449797

@steve's ist eigentlich die eleganteste Art, dies zu tun.

Für den "richtigen" Weg siehe das Argument des Schlüsselworts order von numpy.ndarray.sort

Allerdings müssen Sie Ihr Array als ein Array mit Feldern (ein strukturiertes Array) betrachten.

Der "korrekte" Weg ist ziemlich hässlich, wenn Sie Ihr Array nicht ursprünglich mit Feldern definiert haben...

Als schnelles Beispiel, um es zu sortieren und eine Kopie zurückzugeben:

In [1]: import numpy as np

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

In [3]: np.sort(a.view('i8,i8,i8'), order=['f1'], axis=0).view(np.int)
Out[3]: 
array([[0, 0, 1],
       [1, 2, 3],
       [4, 5, 6]])

Um sie an Ort und Stelle zu sortieren:

In [6]: a.view('i8,i8,i8').sort(order=['f1'], axis=0) #<-- returns None

In [7]: a
Out[7]: 
array([[0, 0, 1],
       [1, 2, 3],
       [4, 5, 6]])

@Steve's ist wirklich der eleganteste Weg, es zu tun, soweit ich weiß...

Der einzige Vorteil dieser Methode ist, dass das Argument "order" eine Liste der Felder ist, nach denen die Suche sortiert werden soll. Sie können zum Beispiel nach der zweiten Spalte, dann nach der dritten Spalte und dann nach der ersten Spalte sortieren, indem Sie order=['f1','f2','f0'] angeben.

 Community
Community
Bearbeitete Antwort 23. Mai 2017 в 12:10
numpy.ndarray.sort &#8212; NumPy v1.23 Manual
docs.scipy.org
123
0
 J.J
J.J
5. Juli 2016 в 1:42
2016-07-05T01:42:09+00:00
Mehr
Quelle
Bearbeiten
#10449801

Sie können nach mehreren Spalten gemäß der Methode von Steve Tjoa's sortieren, indem Sie eine stabile Sortierung wie Mergesort verwenden und die Indizes von der am wenigsten signifikanten zu den signifikantesten Spalten sortieren:

a = a[a[:,2].argsort()] # First sort doesn't need to be stable.
a = a[a[:,1].argsort(kind='mergesort')]
a = a[a[:,0].argsort(kind='mergesort')]

Dabei wird nach Spalte 0, dann 1, dann 2 sortiert.

 J.J
J.J
Bearbeitete Antwort 25. Februar 2017 в 10:37
28
0
 user541064
user541064
28. September 2011 в 8:05
2011-09-28T20:05:37+00:00
Mehr
Quelle
Bearbeiten
#10449798

Von der Python-Dokumentation Wiki, ich denke, Sie können tun:

a = ([[1, 2, 3], [4, 5, 6], [0, 0, 1]]); 
a = sorted(a, key=lambda a_entry: a_entry[1]) 
print a

Die Ausgabe ist:

[[[0, 0, 1], [1, 2, 3], [4, 5, 6]]]
Peter Mortensen
Peter Mortensen
Bearbeitete Antwort 26. Mai 2017 в 10:00
HowTo/Sorting - Python Wiki
wiki.python.org
19
0
 prl900
prl900
25. Februar 2016 в 10:37
2016-02-25T10:37:19+00:00
Mehr
Quelle
Bearbeiten
#10449800

Für den Fall, dass jemand die Sortierung an einem kritischen Teil seiner Programme nutzen möchte, hier's ein Leistungsvergleich für die verschiedenen Vorschläge:

import numpy as np
table = np.random.rand(5000, 10)

%timeit table.view('f8,f8,f8,f8,f8,f8,f8,f8,f8,f8').sort(order=['f9'], axis=0)
1000 loops, best of 3: 1.88 ms per loop

%timeit table[table[:,9].argsort()]
10000 loops, best of 3: 180 µs per loop

import pandas as pd
df = pd.DataFrame(table)
%timeit df.sort_values(9, ascending=True)
1000 loops, best of 3: 400 µs per loop

Es sieht also so aus, als ob die Indizierung mit [argsort][1] die bisher schnellste Methode ist...

[1]: http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.argsort.html

numpy.argsort &mdash; NumPy v1.10 Manual
docs.scipy.org
17
0
 fgregg
fgregg
3. Juni 2015 в 3:03
2015-06-03T15:03:49+00:00
Mehr
Quelle
Bearbeiten
#10449799

Von [der NumPy-Mailingliste][1], hier's eine weitere Lösung:

>>> a
array([[1, 2],
       [0, 0],
       [1, 0],
       [0, 2],
       [2, 1],
       [1, 0],
       [1, 0],
       [0, 0],
       [1, 0],
      [2, 2]])
>>> a[np.lexsort(np.fliplr(a).T)]
array([[0, 0],
       [0, 0],
       [0, 2],
       [1, 0],
       [1, 0],
       [1, 0],
       [1, 0],
       [1, 2],
       [2, 1],
       [2, 2]])

[1]: http://mail.scipy.org/pipermail/numpy-discussion/2008-December/039332.html

Peter Mortensen
Peter Mortensen
Bearbeitete Antwort 26. Mai 2017 в 10:00
16
0
 xuma202
xuma202
4. November 2016 в 12:21
2016-11-04T00:21:27+00:00
Mehr
Quelle
Bearbeiten
#10449803

Ich hatte ein ähnliches Problem.

Mein Problem:

Ich möchte eine SVD berechnen und muss meine [Eigenwerte][1] in absteigender Reihenfolge sortieren. Aber ich möchte die Zuordnung zwischen Eigenwerten und Eigenvektoren beibehalten. Meine Eigenwerte standen in der ersten Zeile und der entsprechende Eigenvektor darunter in der gleichen Spalte.

Ich möchte also ein zweidimensionales Array spaltenweise nach der ersten Zeile in absteigender Reihenfolge sortieren.

Meine Lösung

a = a[::, a[0,].argsort()[::-1]]

Wie funktioniert das also?

a[0,] ist nur die erste Zeile, nach der ich sortieren möchte.

Jetzt benutze ich argsort, um die Reihenfolge der Indizes zu erhalten.

Ich verwende [::-1], weil ich eine absteigende Reihenfolge brauche.

Zuletzt benutze ich a[::, ...], um eine Ansicht mit den Spalten in der richtigen Reihenfolge zu erhalten.

[1]: https://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors

Peter Mortensen
Peter Mortensen
Bearbeitete Antwort 26. Mai 2017 в 10:09
Eigenvalues and eigenvectors - Wikipedia
en.wikipedia.org
4
0
 hpaulj
hpaulj
7. August 2016 в 4:33
2016-08-07T16:33:59+00:00
Mehr
Quelle
Bearbeiten
#10449802

Ein etwas komplizierteres lexsort Beispiel - absteigend auf der 1. Spalte, sekundär aufsteigend auf der 2. Die Tricks bei lexsort sind, dass es nach Zeilen sortiert (daher das .T), und der letzten den Vorrang gibt.

In [120]: b=np.array([[1,2,1],[3,1,2],[1,1,3],[2,3,4],[3,2,5],[2,1,6]])
In [121]: b
Out[121]: 
array([[1, 2, 1],
       [3, 1, 2],
       [1, 1, 3],
       [2, 3, 4],
       [3, 2, 5],
       [2, 1, 6]])
In [122]: b[np.lexsort(([1,-1]*b[:,[1,0]]).T)]
Out[122]: 
array([[3, 1, 2],
       [3, 2, 5],
       [2, 1, 6],
       [2, 3, 4],
       [1, 1, 3],
       [1, 2, 1]])
1
0
 Sefa
Sefa
30. Januar 2018 в 7:36
2018-01-30T19:36:58+00:00
Mehr
Quelle
Bearbeiten
#10449804

Hier ist eine weitere Lösung, die alle Spalten berücksichtigt (kompakterer Weg von [J.J][1]'s Antwort);

ar=np.array([[0, 0, 0, 1],
             [1, 0, 1, 0],
             [0, 1, 0, 0],
             [1, 0, 0, 1],
             [0, 0, 1, 0],
             [1, 1, 0, 0]])

Sortieren mit Lexsort,

ar[np.lexsort(([ar[:, i] for i in range(ar.shape[1]-1, -1, -1)]))]

Ausgabe:

array([[0, 0, 0, 1],
       [0, 0, 1, 0],
       [0, 1, 0, 0],
       [1, 0, 0, 1],
       [1, 0, 1, 0],
       [1, 1, 0, 0]])

[1]: https://stackoverflow.com/users/3329564/j-j

0
0
Frage hinzufügen
Kategorien
Alle
Technologie
Kultur/Erholung
Leben/Kunst
Wissenschaft
Professionell
Unternehmen
Benutzer
Alle
Neu
Beliebt
1
Роман Азаров
Registriert vor 1 Woche
2
Mansur Zakirov
Registriert vor 1 Woche
3
Тагир Мамедов
Registriert vor 1 Woche
4
Алексей Толманов
Registriert vor 1 Woche
5
Valeriu Vodnicear
Registriert vor 3 Wochen
DE
ES
ID
JA
PT
TR
ZH
© kzen.dev 2023
Quelle
stackoverflow.com
unter Lizenz cc by-sa 3.0 mit Attribut