Alla ricerca di un modo per identificare in modo affidabile se un oggetto numpy è una vista.numpy: indicatore affidabile (non conservativo) se la matrice numpy è vista
Domande correlate sono venuto molte volte in passato (here, here, here), e la gente ha offerto alcune soluzioni, ma tutti sembrano avere problemi:
- Il test utilizzato in
pandas
ora è quello di chiamare qualcosa una vista semy_array.base is not None
. Questo sembra sempre prendere punti di vista, ma offre anche molti falsi positivi (situazioni in cui segnala qualcosa è una vista anche se non lo è). numpy.may_share_memory()
verificherà la presenza di due array specifici, ma non risponderò genericamente- (@RobertKurn dice era migliore strumento a partire dal 2012 -? Eventuali modifiche)
flags['OWNDATA'])
è reported (third comment first answer) a fallire nel alcuni casi.
(Il motivo del mio interesse è che sto lavorando per l'attuazione copy-on-write per i panda, e un indicatore conservatore sta portando a un eccesso di copiatura.)
discussione pertinente sul tracker github numpy: https://github.com/numpy/numpy/issues/5604 –
Le situazioni descritte come falsi positivi sembrano essere quando un'operazione che "crea una copia" restituisce effettivamente una vista di una copia. Se questo è da considerarsi "non una vista", si potrebbe provare a controllare il refcount della 'base' dell'array per vedere se ci sono altri riferimenti ad esso, ma ciò non sarà perfetto. Non penso sia possibile rilevare in modo affidabile questo tipo di cose. – user2357112
Vedi anche questa recente domanda SO, http://stackoverflow.com/questions/33467477/how-to-find-all-variables-with-identical-id. Menziona una nuova funzione, 'np.shares_memory'. Ma ho notato che una cosa è confrontare 2 variabili conosciute, un'altra è chiedere un array condivide il buffer di dati con qualsiasi altro array. – hpaulj