8

2次元のnumpy配列(おそらくマルチ次元)として保存された画像があります。

2D スライディング ウィンドウを反映する配列のビューを作成できますが、各行がフラット化されたウィンドウ (行はウィンドウ、列はそのウィンドウのピクセル) になるように形状を変更すると、Python は完全なコピーを作成します。これは、典型的なストライド トリックを使用しており、新しい形状がメモリ内で連続していないためです。

これが必要なのは、大きな画像全体を sklearn 分類器に渡しているためです。これは、バッチ/部分適合手順がなく、完全に展開されたコピーがメモリに対して大きすぎる 2 次元マトリックスを受け入れます。

私の質問: ビューの完全なコピーを作成せずにこれを行う方法はありますか?

答えは、(1)私が見落としていたストライドまたはnumpyメモリ管理に関するもの、または(2)numpy配列を含むsklearnのような外部パッケージに対してもエミュレートできるpythonのある種のマスクされたメモリ構造のいずれかになると思いますサイトン。

メモリ内の 2D イメージの移動ウィンドウをトレーニングするこのタスクは一般的ですが、パッチを直接説明するために私が知っている唯一の試みは、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
4

1 に答える 1