sto cercando il modo più efficiente di memoria per calcolare il valore assoluto quadrato di un complesso NumPy ndarrayModo più memoria-efficiente per calcolare abs() ** 2 di NumPy complesso ndarray
arr = np.empty((250000, 150), dtype='complex128') # common size
Non ho trovato un ufunc che faccia esattamente lo np.abs()**2
.
Come una matrice di tale dimensione e tipo occupa circa mezzo GB, sto cercando un modo principalmente efficiente di memoria.
Vorrei anche che fosse portatile, così idealmente una combinazione di ufuncs.
Finora la mia comprensione è che questo dovrebbe essere di circa il migliore
result = np.abs(arr)
result **= 2
Sarà inutilmente calcolare (**0.5)**2
, ma dovrebbe calcolare **2
sul posto. Complessivamente, il requisito di memoria di picco è solo la dimensione dell'array originale + la dimensione dell'array del risultato, che dovrebbe essere 1,5 * la dimensione originale dell'array in quanto il risultato è reale.
Se avessi voluto eliminare l'inutile **2
chiamata avrei dovuto fare qualcosa di simile
result = arr.real**2
result += arr.imag**2
ma se non mi sbaglio, questo significa che dovrò allocare memoria per sia il il calcolo della parte reale e immaginaria, quindi l'utilizzo della memoria di picco sarebbe pari a 2.0 * della dimensione originale dell'array. Le proprietà arr.real
restituiscono anche un array non contiguo (ma ciò è di minore importanza).
C'è qualcosa che mi manca? Ci sono modi migliori per farlo?
EDIT 1: Mi dispiace per non mettendo in chiaro, non voglio sovrascrivere arr, quindi non posso usarlo come fuori.
Mi piacerebbe accettare questa risposta come risposta, ma non sono sicuro di quanto sia portatile. Numba è abbastanza facile da installare in questi giorni con Anaconda sulla maggior parte delle macchine, ma non sono sicuro di quanto siano portatili tra le architetture le attuali associazioni LLVM. Forse potresti aggiungere alcune informazioni sulla portabilità di questa risposta. –
Bene, sono un esperto di LLVM, ma la documentazione della versione corrente (0.31.0) dice: Supportati sono Linux, Windows 7 e OS X 10.9 e successivi. – burnpanck