2014-04-30 18 views
6

Ich versuche, eine sehr große spärliche Matrix zu erstellen, die eine Form (447957347, 5027974) hat. Und es enthält 3.289.288.566 Elemente.So erstellen Sie eine riesige spärliche Matrix in scipy

Aber, wenn ich eine csr_matrixscipy.sparse verwenden, ist es so etwas wie dies zurück:

<447957346x5027974 sparse matrix of type '<type 'numpy.uint32'>' 
    with -1005678730 stored elements in Compressed Sparse Row format> 

Der Quellcode Matrix für die Erstellung ist:

indptr = np.array(a, dtype=np.uint32) # a is a python array('L') contain row index information 
indices = np.array(b, dtype=np.uint32) # b is a python array('L') contain column index information 
data = np.ones((len(indices),), dtype=np.uint32) 
test = csr_matrix((data,indices,indptr), shape=(len(indptr)-1, 5027974), dtype=np.uint32) 

Und fand ich auch, wenn ich konvertieren ein 3 Milliarden langes Python-Array zu einem numpy-Array führt zu einem Fehler:

ValueError:setting an array element with a sequence 

Wenn ich jedoch drei Python-Arrays mit einer Länge von 1 Milliarde erstellen und diese in ein numpy-Array umwandeln, dann hänge sie an. Es funktioniert gut.

Ich bin verwirrt.

+1

Anstatt "a" und "b" zu beschreiben, können Sie Code hinzufügen, der Beispieldaten generiert? – YXD

+0

@Ofey Vielleicht können Sie die coo_matrix verwenden, um Ihre spärliche Matrix zu erstellen, die einfacher erscheint als Ihr aktueller Ansatz: 'test = coo_matrix ((Daten, (Zeilen, Spalten)), Form = (m, n))' –

+0

Sind Sie Verwenden von 32-Bit-Python oder ein 32-Bit-System? Klingt so, als würden Sie eine 32-Bit-Grenze für vorzeichenbehaftete Ganzzahlen erreichen. – jrennie

Antwort

8

Sie verwenden eine ältere Version von SciPy. In der ursprünglichen Implementierung von dünn besetzten Matrizen wurden Indizes in einer int32 Variablen gespeichert, sogar auf 64-Bit-Systemen. Selbst wenn Sie sie so definieren, dass sie uint32 sind, wie Sie, werden sie gecastet. Wenn also Ihre Matrix mehr als 2^31 - 1 Einträge ungleich Null enthält, wie es in Ihrem Fall der Fall ist, kommt es zu einem Überlauf der Indizierung und viele schlimme Dinge passieren. Beachten Sie, dass die seltsame negative Anzahl von Elementen in Ihrem Fall erklärt sich durch:

>>> np.int32(np.int64(3289288566)) 
-1005678730 

Die gute Nachricht ist, dass dies bereits herausgefunden worden. Ich denke, ist die relevante PR, obwohl es einige weitere Korrekturen nach diesem gab. In jedem Fall, wenn Sie die latest release candidate für SciPy 0.14 verwenden, sollte Ihr Problem verschwunden sein.

+0

Es funktioniert, Thx! Ich denke, wenn scipy eine Schnittstelle verlassen, um den Index-Datentyp zu setzen wäre großartig. Eigentlich verschwendet Int64 etwas Platz;) – Ofey

+2

Scipy (> = 0.14.0) verwendet die kleinste benötigte Integergröße. –

Verwandte Themen