selbstgeschriebene Funktion performanter machen

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
scandium
User
Beiträge: 25
Registriert: Montag 26. Januar 2015, 18:52

Hallo Zusammen,

für ein kleines Programm habe ich mir eine Funktion selbst geschrieben.
Diese funktioniert soweit, ist aber langsam und braucht 97% der Rechenzeit des gesamten Programms.

Dir Funktion bekommt als Input ein Numpy Array der Größe 300000x3
In der 3 Spalte sind Zahlen zwischen -5 bis 100.
Ziel war es eine Matrix zu erzeugen in dem nur Zeilen des Arrays sind, die in der dritten Spalte Zahlen kleine 5 haben.
Mit einen for loop habe ich eine Zählvariable erzeugt, danach die Matrix konditioniert und dann per zweiten for loop die Werte dort rein geschrieben.

Gibt es für das Problem eine elegantere Lösung mit der man die Geschwindigkeit steigern könnte?

Code: Alles auswählen

def rdc(m_compl)  :
    j=0;m_red=[]
    x=np.argsort(m_compl[:,2])
    for i in range(0,len(x)):
        index=x[i];
        if m_compl[index,2] <= 5:
            j=j+1
            m_red=np.ones((j,3))      
    for i in range(0,j):
        index=x[i]
        m_red[i,0]=m_compl[index,0]
        m_red[i,1]=m_compl[index,1]
        m_red[i,2]=m_compl[index,2]
    return m_red  
BlackJack

@scandium: Lass die Python-Schleifen weg und lies mal in der Numpy-Dokumentation was man alles als Index verwenden kann. Mir ist die Funktion da zu kompliziert um sie jetzt nachzuvollziehen, darum gehe ich mal nur nach Deinem Text: Erzeuge ein Array mit Wahrheitswerten wo der Wert True steht wenn in der dritten Spalte eine Zahl kleiner als fünf ist und False sonst, und dann nimm dieses Array als Index in das Ausgangsarray. Ungetestet: ``return m_compl[m_compl[:, 2] < 5]``
scandium
User
Beiträge: 25
Registriert: Montag 26. Januar 2015, 18:52

@BlackJack

in der Numpy Docu fande ich "np.compress" am besten.
Nun sieht die Funktion so aus:

Code: Alles auswählen

def rdc(m_compl)  :
    index=m_compl[:,2]<=5
    m_red=np.compress(index,m_compl, axis=0)
    return m_red 
Was es nicht alles wie schöne Funktionen in Numpy gibt :D
BlackJack

@scandium: Finde ich irgendwie komplizierter als meinen Ansatz. Welchen Vorteil hat das denn so?
scandium
User
Beiträge: 25
Registriert: Montag 26. Januar 2015, 18:52

@BlackJack
Bei genauerer Betrachtung gar keinen. Kommt bei beiden das gleiche raus.
Dein Ansatz ist noch kürzer, also werde ich ihn nehmen.

Danke.
Antworten