Что может быть лучшим способом обойти `MemoryError` в этом случае? - PullRequest
0 голосов
/ 14 мая 2018

У меня есть два numpy массива довольно большого размера.Первый - arr1 размера (40, 40, 3580), второй - arr2 размера (3580, 50).Чего я хочу добиться, так это

arr_final = np.sum(arr1[..., None]*arr2, axis = 2)

, чтобы размер arr_final был просто (40, 40, 50).Однако при выполнении вышеизложенного python, вероятно, кэширует операции внутреннего массива, поэтому я продолжаю получать ошибки памяти.Есть ли способ избежать внутреннего кеширования и просто получить конечный результат?Я смотрел на numexpr, но я не уверен, как можно достичь arr1[..., None]*arr2, а затем sum над axis=2 в numexpr.Любая помощь или предложение будут оценены.

1 Ответ

0 голосов
/ 14 мая 2018

Если вы имели в виду np.sum(arr1[..., None]*arr2, axis = 2), с ... вместо :, то это просто dot:

arr3 = arr1.dot(arr2)

Это должно быть более эффективно, чем явная материализация arr1[..., None]*arr2,но я не знаю точно, какие промежуточные звенья он выделяет.

Вы также можете выразить вычисление с помощью einsum.Опять же, это должно быть более эффективным, чем явная материализация arr1[..., None]*arr2, но я не знаю точно, что он выделяет.

arr3 = numpy.einsum('ijk,kl', arr1, arr2)
...