2017-03-15 12 views
2

forループを使ってより大きい行列を反復する方法を探しています。各反復ではサイズ(行、列、深さ)のサブ行列が出力されます(6、 3,3)。より大きい行列を使って部分行列を反復する

私の大きな行列は、numpy行列として格納され、各繰り返しが出力されるようにも可能です。

>>> import numpy as np 
>>> a = np.random.rand(6*3,3*3,3) 
>>> print a.shape 
(18, 9, 3) 
>>> print a 
>>> b 

変数bは、行列aからサイズ(6,3,3)のすべてのサブ行列を含む必要があります。 各サブマトリックスは、以前のサブマトリックスと重複してはいけません。

enter image description here

+0

スライディングマトリックスをお探しですか?入力配列にはいくつのディメンションがありますか?サンプルケースを追加できますか? – Divakar

+0

はい...私はそれをスライディングマトリックスと呼ぶことができると思います。次元のウェル..行は常に78(6で割り切れる)です。列はデータの長さに依存しますが、常に3で割り切れ、深度は3です(実際には4 RGBAですが、アルファチャンネルをスライスしています) –

+0

ちょうど編集されたサンプルデータから、 – Divakar

答えて

2

アプローチ#1

私たちはnon-overlapping/distinctブロックを探していると仮定しています。サンプル実行

from skimage.util.shape import view_as_blocks 

BSZ = (6,3,3) 
out = view_as_blocks(a,BSZ).reshape((-1,)+ (BSZ)) 

- -

In [279]: a = np.random.rand(6*3,3*3,3) 

In [280]: out = view_as_blocks(a,BSZ).reshape((-1,)+ (BSZ)) 

In [281]: out.shape 
Out[281]: (9, 6, 3, 3) 

reshapingtransposeのようなだけでネイティブのnumpyのツールを使用したアプローチ#2

が、ここでは一つの方法だなどとして、我々はScikit-image's view_as_blocksユーティリティを使用することができます -

m,n,r = a.shape 
split_shp = m//BSZ[0], BSZ[0], n//BSZ[1], BSZ[1], r//BSZ[2], BSZ[2] 
out = a.reshape(split_shp).transpose(0,2,4,1,3,5).reshape((-1,)+ (BSZ)) 
+0

私はアプローチ#1を試み、この警告を受けましたか? –

+0

'/usr/local/lib/python2.7/dist-packages/skimage/util/shape.py:94:RuntimeWarning:コピーしないで連続していない入力配列に対してビューを提供することはできません。 warn(RuntimeWarning( "連続していない入力に対してビューを提供することはできません" –

+0

何か心配する必要がありますか? –

関連する問題