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.
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
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'? –
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