Spalten einer Matrix nach Wert des ersten Eintrages sortieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
dot
User
Beiträge: 12
Registriert: Montag 25. September 2017, 18:48

Liebe Leute im Forum,

ich habe hier ein kleines Problem: Ich möchte die Spalten einer Matrix so sortieren, dass die Einträge der 1. Zeile aufsteigend sortiert sind, die Spalten als ganzes aber erhalten bleiben. Der Befehl "sort" sortiert leider die komplette Matrix um, sodass die Spalten nicht erhalten bleiben.

Hier mein Versuch:

Code: Alles auswählen

import numpy as np

n=7
c=np.eye(n)
c[0]=[9,2,3,3,5,6,7]
b=sorted(c[0])

d=np.zeros((n,n))

while(np.array_equal(b,d[0])==False):
    for i in range(n-1):
        ffirst=c[:,i]
        fsec=c[:,i+1]
        if(c[0][i]<c[0][i+1]):
            d[:,i]=ffirst
            d[:,i+1]=fsec
        else:
            d[:,i]=fsec
            d[:,i+1]=ffirst
      
print(d)
d soll die neue sortierte Matrix sein. Es kommt keine Fehlermeldung, aber auch kein Output. Bin noch blutiger Anfänger und freu mich über Hinweise auf Fehler.

Ich brauch die Lösung des Problems, um Eigenvektoren nach der Größe ihrer Eigenwerte zu sortieren.

Danke schonmal für Eure Hilfe!
dot
User
Beiträge: 12
Registriert: Montag 25. September 2017, 18:48

Habe jetzt selbst eine Lösung gefunden. Falls andereLeute das selbe Problem haben, hier ist die Lösung:

Code: Alles auswählen

import numpy as np

n=7
c=np.eye(n)
c[0]=[9 ,10 ,3 ,3 ,5 ,6 ,7]
b=sorted(c[0])
f=np.argsort(c[0])


d=np.zeros(shape=(n,n))
for i in range(n):
    d[:,i]=c[:,f[i]]
print(d)
Ich wünsche allen einen schönen Abend.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@dot: Du hast ja die Lösung schon selbst gefunden: `argsort`. Aber Dein restlicher Code ist noch sehr umständlich, b brauchst Du nicht und Spalten umsortieren geht einfach per Indexzugriff:

Code: Alles auswählen

import numpy as np

n = 7
c = np.eye(n)
c[0] = [9 ,10 ,3 ,3 ,5 ,6 ,7]
d = c[:, c[0].argsort()]
print(d)
dot
User
Beiträge: 12
Registriert: Montag 25. September 2017, 18:48

Ok. toll, vielen Dank!
Antworten