2016-03-30 4 views
1

Я получаю MemoryError с numpy.where, но я не уверен, почему. Я не могу опубликовать фактический код здесь, но ниже приведен небольшой рабочий пример, который реплицирует проблему.MemoryError с numpy где

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 

Я понимаю, что добавление памяти в моем компьютере будет решить эту проблему, но я хотел бы понять, что здесь происходит.

Я ожидаю, что фрагменты массива выше не будут копировать массив, а только возвращать представление, но я полагаю, что на самом деле он копирует массив по какой-то причине.

ответ

1

Здесь нет «волшебства», массив данных, который вы создаете с помощью np.random.randn(100000, 1, 1, 1, 45, 2, 3), очень велик.

Numpy, кажется, сохраняет каждое число как 64-битное (8 байт) float, поэтому ваш массив занимает около 206 мегабайт памяти (100000 * 1 * 1 * 1 * 45 * 2 * 3 * 8).

/usr/bin/time -v python test.py говорит, что программа использует около 580 МБ на своем пике, что может быть связано с копированием объекта.

Смежные вопросы