我有一个存储为二维 numpy 数组(可能是多维)的图像。
我可以在该数组上创建一个反映二维滑动窗口的视图,但是当我对其进行整形以使每一行都是一个扁平窗口(行是窗口,列是该窗口中的一个像素)时,python 会制作一个完整的副本。这样做是因为我使用的是典型的跨步技巧,并且新形状在内存中并不连续。
我需要这个,因为我将整个大图像传递给一个 sklearn 分类器,该分类器接受 2d 矩阵,其中没有批处理/部分拟合过程,并且完整的扩展副本对于内存来说太大了。
我的问题:有没有办法在不完全复制视图的情况下做到这一点?
我相信答案要么是(1)我忽略的有关 strides 或 numpy 内存管理的东西,要么(2)python 的某种掩码内存结构可以模拟 numpy 数组,甚至可以模拟像 sklearn 这样的外部包,其中包括赛通。
这种在内存中移动二维图像窗口的训练任务很常见,但我所知道的直接解释补丁的唯一尝试是 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