2016-05-11 18 views
0

Ich arbeite mit binären (nur 0 und 1) Matrizen von Zeilen und Spalten in der Größenordnung von ein paar tausend. Die Anzahl der Zeilen liegt beispielsweise zwischen 2000 und 7000 und die Anzahl der Spalten zwischen 4000 und 15000. Mein Computer hat mehr als 100 g RAM.MemoryError in numpy Matrix Multiplikation oder Einsum Operationen

Ich bin überrascht, dass selbst mit diesen Größen, bekomme ich MemoryError mit dem folgenden Code. Für die Reproduzierbarkeit, ich auch ein Beispiel mit einer kleineren Matrix (10 * 20) als Hinweis beide des folgenden heben diesen Fehler:

import numpy as np 

    my_matrix = np.random.randint(2,size=(10,20)) 
    tr, tc = np.triu_indices(my_matrix.shape[0],1) 
    ut_sums = np.sum(my_matrix[tr] * my_matrix[tc], 1) 

    denominator = 100 
    value = 1 - ut_sums.astype(float)/denominator 
    np.einsum('i->', value) 

ich versuchte, das element Multiplikation in dem obigen Code zu ersetzen, wie unten an einsum , aber es erzeugt auch die gleiche Memory:

import numpy as np 

    my_matrix = np.random.randint(2,size=(10,20)) 
    tr, tc = np.triu_indices(my_matrix.shape[0],1) 
    ut_sums = np.einsum('ij,ij->i', my_matrix[tr], my_matrix[tc]) 

    denominator = 100 
    value = 1 - ut_sums.astype(float)/denominator 
    np.einsum('i->', value) 

In beiden Fällen werden die gedruckten Punkte Traceback auf der Linie, wo ut_sums berechnet wird.

Bitte beachten Sie, dass mein Code auch andere Operationen hat, und es gibt andere Statistiken, die auf Matrizen ähnlicher Größe berechnet werden, aber mit mehr als 100 g, dachte ich, es sollte kein Problem sein.

Antwort

0

Nur weil Ihr Computer über 100 GB physischen Speicher verfügt, bedeutet dies nicht, dass Ihr Betriebssystem bereit ist oder in der Lage ist, solch große Mengen an zusammenhängendem Speicher zuzuweisen. Und es muss zusammenhängend sein, denn so sind NumPy-Arrays normalerweise.

sollten Sie herausfinden, wie groß Ihre Ausgangsmatrix sein soll, und dann versuchen, ein ähnliches selbst erstellen:

arr = np.zeros((10000, 10000)) 

Sehen Sie, wenn Sie in der Lage sind, als ein einzelnes Array zuzuordnen groß wie Sie wollen.

+0

Ich konnte auch Matrix mit np.zeros ((100000, 100000)) erstellen, aber eine Matrix der Größe 1000000 * 1000000 kann nicht wegen MemoryError erstellt werden. Allerdings ist meine Matrix viel kleiner. Kann ich etwas tun, um es zu lösen? Die Matrix ist binär (nur Einsen und Nullen) und spärlich. Könnte ich sparse Matrix von scipy verwenden? Würden die elementischen Multiplikations- oder Einsum-Operationen mit dünn besetzten Matrizen gut funktionieren? – vpk

+0

Ja, wenn Ihre Daten spärlich sind, sollten Sie die Funktionen der spärlichen Matrix in NumPy und Freunden nutzen. Und wenn deine Matrix nur Nullen und Einsen ist: verwendest du 'dtype = bool'? –

+0

Nein, ich verwende nicht dtype = bool. Nun, da ich daran denke, könnte ich es während der Erstellung der Matrix verwenden, aber ich habe nicht darüber nachgedacht, wie man mit der Bool-Matrix ut_sums berechnet. Auch gerade habe ich scipy.sparse lil_matrix, Elementwise Multiplikation wie im ersten Code-Block oben versucht. Aber auf einer relativ leistungsfähigen Maschine lief es ungefähr 15 Minuten lang, bevor es mit MemoryError versagte. Der Stacktrack zeigt auf die Zeile, in der ich eine spärliche Matrix aus dem Original erstelle: my_matrix = scipy.sparse.lil_matrix (np.random.randint (2, size = (100000, 100000))) Das scheint ein bisschen zu sein unvernünftig für mich. – vpk