2016-09-27 6 views
1

Ich habe einen Matlab-Code auf Python portiert und Probleme mit der Effizienz konfrontiert.Matlab zu Python-Port-Optimierung

Zum Beispiel kommt hier ein Ausschnitt:

G = np.vstack((Gx.toarray(), Gy.toarray(), Gd1.toarray(), Gd2.toarray())) 

hier alle Elemente gestapelt sind 22500 von 22500 sparce Matrizen werden. Es stirbt direkt auf meinem Windows-64-Bit-Maschine mit folgenden Fehler:

return _nx.concatenate([atleast_2d(_m) for _m in tup], 0) 
MemoryError 

Ich bin ganz neu in Python, ist es eine gute Artikel über Best Practices für eine solche Optimierung? Gibt es Informationen darüber, wie numpy mit dem Speicher funktioniert?

Soweit ich weiß Sparce-Matrizen in irgendeiner Art von komprimiertem Format gespeichert und nehmen viel weniger Platz als, aber nehmen Sie viel mehr Zeit mit zu arbeiten.

Thx!

+0

Sie sind eine dichte oder Sparse Matrix/Array als Ausgang erwartet ? – Divakar

+0

@Divakar der Ausgang ist spärlich – Anton

+2

Der beste Rat auf Optimierung ist - versuchen Sie es nicht, bis Ihr Code funktioniert. Der Speicherfehler bedeutet, dass eines oder mehrere dieser dichten Arrays zu viel Speicherplatz einnehmen, viel mehr als die dünn besetzten Matrizen. Das ist eine harte Einschränkung. Geschwindigkeit ist eine weiche. – hpaulj

Antwort

1

Für schwach besetzte Matrizen Stapeln können Sie Scipy sparse's vstack function statt NumPy die Verwendung vstack ein, wie so -

import scipy.sparse as sp 

Gout = sp.vstack((Gx,Gy,Gd1,Gd2)) 

Probelauf -

In [364]: # Generate random sparse matrices 
    ...: Gx = sp.coo_matrix(3*(np.random.rand(10,10)>0.7).astype(int)) 
    ...: Gy = sp.coo_matrix(4*(np.random.rand(10,10)>0.7).astype(int)) 
    ...: Gd1 = sp.coo_matrix(5*(np.random.rand(10,10)>0.7).astype(int)) 
    ...: Gd2 = sp.coo_matrix(6*(np.random.rand(10,10)>0.7).astype(int)) 
    ...: 

In [365]: # Run original and proposed approaches 
    ...: G = np.vstack((Gx.toarray(), Gy.toarray(), Gd1.toarray(), Gd2.toarray())) 
    ...: Gout = sp.vstack((Gx,Gy,Gd1,Gd2)) 
    ...: 

In [366]: # Finally verify results 
    ...: np.allclose(G,Gout.toarray()) 
Out[366]: True 
+0

danke aber was ist der Unterschied? Ist es für dünn besetzte Matrizen optimiert? – Anton

+2

@Anton 'Gout' ist eine spärliche Matrix, daher ist es für Speicher optimiert. Sie haben bemerkt, dass Sie eine spärliche Matrix als Ausgabe suchen, oder? – Divakar

+1

'Sparse.vstack' arbeitet direkt mit den dünn besetzten Matrixdaten. Es konvertiert die Matrizen nicht in große, dichte. Aber um es zu verstehen, müssen Sie verstehen, wie dünn besetzte Matrizen gespeichert werden. – hpaulj