2016-03-30 15 views
1

Ich bekomme eine MemoryError mit numpy.where aber ich bin mir nicht sicher warum. Ich kann den eigentlichen Code hier nicht veröffentlichen, aber unten ist ein kleines Arbeitsbeispiel, das das Problem repliziert.MemoryError mit numpy wo

import numpy as np 
dat = np.random.randn(100000, 1, 1, 1, 45, 2, 3) 
# The following two steps seem superfluous but I wanted to replicate 
# behaviour in the original code  
cond = dat[:,0,0,0,0,0,0] > 0 
cond = cond[:,None,None,None,None,None,None] 

dat2 = np.where(cond, dat, 0) 
dat[...,2] = np.where(cond, dat[...,2], dat2[...,2]) # Causes MemoryError 

Ich verstehe, dass mehr Speicher zu meinem Computer hinzugefügt wird, das Problem zu lösen, aber ich möchte verstehen, was hier vor sich geht.

Ich erwarte, dass die Array-Schnitte oben das Array nicht kopieren, sondern nur eine Ansicht zurückgeben, aber ich nehme an, dass es tatsächlich das Array aus irgendeinem Grund kopiert.

Antwort

1

Es gibt hier keine "Magie", Ihr Datenarray, das Sie mit np.random.randn(100000, 1, 1, 1, 45, 2, 3) erstellen, ist sehr groß.

Numpy scheint jede Zahl als 64 Bit (8 Byte) Float zu speichern, so dass Ihr Array etwa 206 Megabyte Speicher belegt (100000 * 1 * 1 * 1 * 45 * 2 * 3 * 8).

/usr/bin/time -v python test.py sagt, dass das Programm etwa 580 MB an seinem Höhepunkt verwendet, die aufgrund des Kopierens des Objekts sein kann.