2016-03-30 20 views
1

numpy.where ile MemoryError alıyorum ama neden emin değilim. Asıl kodu burada yayınlayamıyorum, ancak aşağıdakileri çoğaltan küçük bir çalışma örneğidir.Numune numarası

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 

Bilgisayarımda daha fazla bellek eklemeyi sorunu çözecek anlıyorum, ama burada neler olduğunu anlamak istiyorum.

Yukarıdaki dizi dilimlerinin diziyi kopyalamayacağını, ancak yalnızca bir görünüm döndüreceğini umuyorum, ancak aslında bir nedenle diziyi kopyaladığını varsayalım.

cevap

1

hayır "sihirli" oluyor burada, sen np.random.randn(100000, 1, 1, 1, 45, 2, 3) çok büyük kullanarak oluşturdukları veri dizisi yoktur.

Numpy, her bir sayıyı 64 bit (8 bayt) kayan gibi saklar, bu nedenle dizininiz yaklaşık 206 Megabayt bellek alır (100000 * 1 * 1 * 1 * 45 * 2 * 3 * 8).

/usr/bin/time -v python test.py programı nesne kopyalama yüzünden olabilir zirvede etrafında 580 MB kullanır söylüyor.

İlgili konular