小编loc*_*mal的帖子

Numpy View重塑没有复制(2d移动/滑动窗口,跨步,蒙面内存结构)

我有一个图像存储为2d numpy数组(可能是multi-d).

我可以在反射2d滑动窗口的数组上进行视图,但是当我重塑它以使每行都是一个平坦的窗口(行是窗口,列是该窗口中的一个像素)时,python会生成一个完整的副本.它这样做是因为我使用了典型的步幅技巧,并且新形状在内存中不连续.

我需要这个,因为我将整个大图像传递给sklearn分类器,该分类器接受2d矩阵,其中没有批处理/部分拟合程序,并且完整的扩展副本对于存储器来说太大了.

我的问题:如果没有完整地复制视图,有没有办法做到这一点?

我相信一个答案将是(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 …
Run Code Online (Sandbox Code Playgroud)

python numpy image scikit-learn scikit-image

7
推荐指数
1
解决办法
1537
查看次数

标签 统计

image ×1

numpy ×1

python ×1

scikit-image ×1

scikit-learn ×1