Ho un'immagine memorizzata come una matrice numerica 2d (possibilmente multi-d).Numpy View Reshape senza copia (2d finestra in movimento/scorrevole, falcate, strutture di memoria mascherate)
Posso creare una vista su quella matrice che riflette una finestra scorrevole 2D, ma quando modifico la finestra in modo che ogni riga sia una finestra appiattita (le righe sono finestre, la colonna è un pixel in quella finestra) python esegue una copia completa . Lo fa perché sto usando il classico trucco del passo e la nuova forma non è contigua nella memoria.
Ho bisogno di questo perché sto passando intere immagini di grandi dimensioni a un classificatore sklearn, che accetta le matrici 2d, dove non c'è alcuna procedura batch/partial fit e la copia espansa completa è troppo grande per la memoria.
La mia domanda: C'è un modo per farlo senza fare una copia completa della vista?
Credo che una risposta sarà (1) qualcosa su strides o gestione della memoria numpy che ho trascurato, o (2) una sorta di struttura di memoria mascherata per python che può emulare un array numpy anche a un pacchetto esterno come sklearn che include cython.
Questo compito di formazione su come spostare finestre di un'immagine 2d in memoria è comune, ma l'unico tentativo che conosco per spiegare direttamente le patch è il progetto Vigra (http://ukoethe.github.io/vigra/).
Grazie per l'aiuto.
>>> A=np.arange(9).reshape(3,3)
>>> print A
[[0 1 2]
[3 4 5]
[6 7 8]]
>>> xstep=1;ystep=1; xsize=2; ysize=2
>>> window_view = np.lib.stride_tricks.as_strided(A, ((A.shape[0] - xsize + 1)/xstep, (A.shape[1] - ysize + 1)/ystep, xsize, ysize),
... (A.strides[0] * xstep, A.strides[1] * ystep, A.strides[0], A.strides[1]))
>>> print window_view
[[[[0 1]
[3 4]]
[[1 2]
[4 5]]]
[[[3 4]
[6 7]]
[[4 5]
[7 8]]]]
>>>
>>> np.may_share_memory(A,window_view)
True
>>> B=window_view.reshape(-1,xsize*ysize)
>>> np.may_share_memory(A,B)
False
penso che questo è impossibile, anche si passa un 'as_strided' array ad un classificatore sklearn, penso che la maggior parte (se non tutti) i classificatori copieranno i tuoi dati se non sono continui. – HYRY
Sì, sono abbastanza sicuro che non si possa fare. Scusate. Se trovi un modo, fammelo sapere;) Inoltre: l'inserimento diretto di un'immagine potrebbe non essere una buona idea e le funzionalità di calcolo potrebbero risolvere il tuo problema. –
Definisci definitivamente il numero (1), 'sklearn.feature_extraction.image.extract_patches' ti dà esattamente la vista di cui stai parlando, e la sua rimodellazione ne farà sicuramente una copia, secondo le regole di Numpy. Sei sicuro di aver bisogno di tutte le patch di molte immagini contemporaneamente? Si consiglia di esaminare gli algoritmi in linea/batch per qualunque sia il tuo obiettivo. Prova 'SGDClassifier' per esempio. – eickenberg