Я ищу наиболее эффективный для памяти способ вычисления абсолютного квадрата значения сложного numpy ndarray
arr = np.empty((250000, 150), dtype='complex128') # common size
Я не нашел ufunc, который сделал бы точно np.abs()**2
.
Поскольку массив такого размера и типа занимает около половины ГБ, я ищу в первую очередь способ, способствующий экономии памяти.
Мне также хотелось бы, чтобы он был переносимым, поэтому идеально сочетается с ufuncs.
До сих пор я понимаю, что это должно быть о лучших
result = np.abs(arr)
result **= 2
Он будет без необходимости вычислять (**0.5)**2
, но должен вычислять **2
на месте. В целом потребность в пиковой памяти - это только исходный размер массива + размер массива результата, который должен иметь размер исходного массива размером 1.5 *, поскольку результат является реальным.
Если бы я хотел избавиться от бесполезного вызова **2
, мне пришлось бы сделать что-то вроде этого
result = arr.real**2
result += arr.imag**2
но если я не ошибаюсь, это означает, что мне нужно будет выделить память для и реального и мнимого вычисления части, поэтому пиковое использование памяти будет иметь размер оригинального массива 2.0 *. Свойства arr.real
также возвращают несмежный массив (но это менее важно).
Есть ли что-то, что мне не хватает? Есть ли лучшие способы сделать это?
ИЗМЕНИТЬ 1: Мне жаль, что я не понимаю, я не хочу перезаписывать arr, поэтому я не могу использовать его как вне.