У меня есть изображение, хранящееся в виде массива 2d numpy (возможно, multi-d).
Я могу сделать вид на этот массив, который отражает 2-мерное скользящее окно, но когда я изменяю его так, чтобы каждая строка была сплющенным окном (строки - это окна, столбец - это пиксель в этом окне), python делает полную копию. Это происходит потому, что я использую типичный трюк с шагом, а новая форма не является непрерывной в памяти.
Мне это нужно, потому что я передаю целые большие изображения классификатору sklearn, который принимает 2-мерные матрицы, где нет процедуры пакетной / частичной подгонки, а полная развернутая копия слишком велика для памяти.
Мой вопрос: есть ли способ сделать это, не делая полную копию представления?
Я считаю, что ответом будет либо (1) что-то о шагах или управлении памятью numpy, что я упустил, либо (2) какая-то структура замаскированной памяти для python, которая может имитировать массив numpy даже для внешнего пакета, такого как sklearn, который включает Cython.
Эта задача обучения перемещению окон двумерного изображения в памяти является распространенной, но единственная известная мне попытка учесть исправления напрямую - это проект Vigra (http://ukoethe.github.io/vigra/).
Спасибо за помощь.
>>> 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
as_strided
классификатору sklearn, я думаю, что большинство (если не все) классификаторов будут копировать ваши данные, если они не непрерывны. - person HYRY   schedule 18.07.2014sklearn.feature_extraction.image.extract_patches
дает вам именно то представление, о котором вы говорите, и его изменение определенно сделает копию в соответствии с правилами numpy. Вы уверены, что вам нужны сразу все патчи многих изображений? Вы можете изучить онлайн / пакетные алгоритмы для решения любых задач. Попробуйте, например,SGDClassifier
. - person eickenberg   schedule 19.07.2014