Более эффективный вариант памяти, чем numpy.where? - PullRequest
0 голосов
/ 27 февраля 2019

У меня большой массив (несколько миллионов элементов), и мне нужно выделить небольшое количество из них (несколько сотен) на основе нескольких различных критериев.В настоящее время я использую np.where вдоль линий:

for threshold in np.arange(0,1,.1):
    x=np.random.random(5000000)
    y=np.random.random(5000000)
    z=np.random.random(5000000)
    inds=np.where((x < threshold) & (y > threshold) & (z > threshold) & (z < threshold+0.1))

DoSomeJunk(a[inds], b[inds], c[inds])

, а затем позже использую ipts, чтобы вытащить правильные точки из различных массивов.Однако я получаю MemoryError в этой строке np.where.Я видел на нескольких других связанных сообщениях, что np.where может быть боровом памяти и копированием данных.

Означает ли наличие множителя & там, что данные копируются несколько раз?Есть ли более эффективный способ нарезать данные таким образом, чтобы он занимал меньше памяти и сохранял список нужных мне индексов, чтобы впоследствии я мог использовать один и тот же срез в нескольких местах?

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

1 Ответ

0 голосов
/ 27 февраля 2019

В каждом из условий вы создаете временный логический массив того же размера, что и x, y и z.Чтобы оптимизировать это, вы можете итеративно создать маску:

for threshold in np.arange(0,1,.1):
    x=np.random.random(5000000)
    y=np.random.random(5000000)
    z=np.random.random(5000000)
    inds = x < threshold
    inds &= y > threshold
    inds &= z > threshold
    inds &= z < threshold+0.1

DoSomeJunk(a[inds], b[inds], c[inds])

В этом примере это уменьшит использование памяти со 160 МБ до 40 МБ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...