Numpy: Уменьшить объем памяти точечного продукта со случайными данными - PullRequest
3 голосов
/ 04 января 2012

У меня есть большой массив numpy, который я собираюсь принять линейной проекцией использования случайно сгенерированных значений.

>>> input_array.shape
(50, 200000)
>>> random_array = np.random.normal(size=(200000, 300))
>>> output_array = np.dot(input_array, random_array)

К сожалению, random_array занимает много памяти, и моя машина начинает обмениваться. Мне кажется, что на самом деле мне не нужно все 1005 одновременно; теоретически я должен быть в состоянии генерировать его лениво во время вычисления точечного произведения ... но я не могу понять, как.

Как можно уменьшить объем памяти при расчете output_array с input_array?

Ответы [ 2 ]

4 голосов
/ 04 января 2012

Это, очевидно, не самое быстрое решение, но вы пробовали:

m, inner = input_array.shape
n = 300
out = np.empty((m, n))
for i in xrange(n):
    out[:, i] = np.dot(input_array, np.random.normal(size=inner))
2 голосов
/ 04 января 2012

Это может быть ситуация, когда использование Cython может уменьшить использование памяти.Вы можете генерировать случайные числа на лету и накапливать результат на ходу.У меня нет времени, чтобы написать и протестировать полную функцию, но вы определенно захотите использовать randomkit (библиотека, которую numpy использует под капотом) на уровне c.

Вы можете взятьПосмотрите на пример кода, который я написал для другого приложения, чтобы увидеть, как обернуть randomkit:

https://github.com/synapticarbors/pylangevin-integrator/blob/master/cIntegrator.pyx

А также посмотрите, как умножение матриц реализовано в следующей статье на Cython:1009 *

http://conference.scipy.org/proceedings/SciPy2009/paper_2/full_text.pdf

Вместо того, чтобы использовать оба массива в качестве входных данных, просто укажите input_array как один, а затем в методе генерируйте небольшие куски случайного массива по ходу работы.

Извините, если это просто набросок, а не реальный код, но, надеюсь, этого достаточно, чтобы вы начали.

...