2017-10-06 11 views
2

私は欲しいものを表現するのが苦労しているので、Googleで見つけられなかったのです。一般的なケースを定式化する前に、例を挙げて始めましょう。同じサイズの配列をタイル状の大きな配列にマージする

それぞれ(4, 5)の形のa1, ..., a7という7つの配列があるとします。 0がnp.zeros((4, 5))あり、この配列は、形状(3*4, 3*5) == (12, 15)である

a1 a2 a3 
a4 a5 a6 
a7 0 0 

:私は7つの配列は、このように配置されている新しい配列をしたいです。一般的に

、私は形状(H, W)のC配列a1, ..., aCを、持っている、と私は形状(h*H, w*W)h = ceil(sqrt(C))w = ceil(C/h)の配列に入れたいです。 C配列は次元配列として(C, H, W)として格納されます。

これを行う最もエレガントな方法は何ですか?私は必要なインデックスを繰り返して何かをハッキングしていましたが、うまくないので止めました。

速度は最優先ではなく、配列はかなり小さいです。

+0

どの配列のCの数が格納されていますか?多次元配列や配列やその他のリストとして? – Divakar

+0

@Divakarはいくつかの詳細を追加しました – fabian789

+0

'np.hstack'を使って配列を使い果たし、最後の行を0で埋め、' np.vstack'で行を連結します。 – Michael

答えて

2

アプローチ#1

軸のいくつかの並び替えや整形は仕事をしなければならない -

C,m,n = a.shape 
h = int(np.ceil(np.sqrt(C))) 
w = int(np.ceil(C/h)) 

out = np.zeros((h,w,m,n),dtype=a.dtype) 
out.reshape(-1,m,n)[:C] = a 
out = out.swapaxes(1,2).reshape(-1,w*n) 

サンプル入力、出力 -

In [340]: a 
Out[340]: 
array([[[55, 58], 
     [75, 78]], 

     [[78, 20], 
     [94, 32]], 

     [[47, 98], 
     [81, 23]], 

     [[69, 76], 
     [50, 98]], 

     [[57, 92], 
     [48, 36]], 

     [[88, 83], 
     [20, 31]], 

     [[91, 80], 
     [90, 58]]]) 

In [341]: out 
Out[341]: 
array([[55, 58, 78, 20, 47, 98], 
     [75, 78, 94, 32, 81, 23], 
     [69, 76, 57, 92, 88, 83], 
     [50, 98, 48, 36, 20, 31], 
     [91, 80, 0, 0, 0, 0], 
     [90, 58, 0, 0, 0, 0]]) 

アプローチ#2

シンプルzeros-concatenationを有するもの - 修正することができる

z = np.zeros((h*w-C,m,n),dtype=a.dtype) 
out = np.concatenate((a,z)).reshape(h,w,m,n).swapaxes(1,2).reshape(-1,w*n) 

は/ np.padzeros-paddingを使用してビットを簡略化 -

zp = np.pad(a,((0,h*w-C),(0,0),(0,0)),'constant') 
out = zp.reshape(h,w,m,n).swapaxes(1,2).reshape(-1,w*n) 
関連する問題