Seite 1 von 1

selbstgeschriebene Funktion performanter machen

Verfasst: Donnerstag 12. Februar 2015, 21:52
von scandium
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  

Re: selbstgeschriebene Funktion performanter machen

Verfasst: Donnerstag 12. Februar 2015, 22:00
von 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]``

Re: selbstgeschriebene Funktion performanter machen

Verfasst: Freitag 13. Februar 2015, 21:17
von scandium
@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

Re: selbstgeschriebene Funktion performanter machen

Verfasst: Freitag 13. Februar 2015, 21:47
von BlackJack
@scandium: Finde ich irgendwie komplizierter als meinen Ansatz. Welchen Vorteil hat das denn so?

Re: selbstgeschriebene Funktion performanter machen

Verfasst: Freitag 13. Februar 2015, 22:14
von scandium
@BlackJack
Bei genauerer Betrachtung gar keinen. Kommt bei beiden das gleiche raus.
Dein Ansatz ist noch kürzer, also werde ich ihn nehmen.

Danke.