2015-11-10 16 views
5

私は形状が26*43264の配列を持っています。私はこれを形状208*208の配列に再構成したいが、塊は26*26である。 配列を正方形の配列に変更するPython

[[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
[10,11,12,13,14,15,16,17,18,19]] 

になり、何かのように:

[[0, 1, 2, 3, 4], 
[10,11,12,13,14], 
[ 5, 6, 7, 8, 9], 
[15,16,17,18,19]] 
+0

'43264 = 208 * 208'で配列を' 26 * 208 * 208'の形に再整形できますが、 '208 * 208 * 26 * 26' – toine

+0

ではなく' np.reshape 、(4,5)) '? – SirParselot

+0

np.reshape(list、(4,5))を実行するだけで、データが正しく分割されないために動作しません。 – Chidwack

答えて

3

この種の再構成に関する質問が以前から出てきました。むしろ、私はすぐに

はあなたのサンプルの配列を作るnumpyのアプローチをdemonstateます検索より:

In [473]: x=np.arange(20).reshape(2,10) 
In [474]: x 
Out[474]: 
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]]) 

使用すると、5

In [475]: x.reshape(2,2,5) 
Out[475]: 
array([[[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9]], 

     [[10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]]]) 

のブロックに分割し、寸法を並べ替えるために転置を使用するように再構築実際にはこれらの行を並べ替えます。

In [476]: x.reshape(2,2,5).transpose(1,0,2) 
Out[476]: 
array([[[ 0, 1, 2, 3, 4], 
     [10, 11, 12, 13, 14]], 

     [[ 5, 6, 7, 8, 9], 
     [15, 16, 17, 18, 19]]]) 

と別の形状これらは転置第一2次元

In [477]: x.reshape(2,2,5).transpose(1,0,2).reshape(4,5) 
Out[477]: 
array([[ 0, 1, 2, 3, 4], 
     [10, 11, 12, 13, 14], 
     [ 5, 6, 7, 8, 9], 
     [15, 16, 17, 18, 19]]) 

xが既にnumpyの配列である場合に、olidateと再構築操作が安い(時間的に)されています。 xが実際にネストされたリストであった場合、リスト操作のもう1つの解決策は、数が少ない配列にオーバーヘッドがあるため、高速になります。

1

少し醜いが、ここであなたがフルサイズのいずれかに変更することができるはずの小さな例えばワンライナーです:

In [29]: from itertools import chain 

In [30]: np.array(list(chain(*[np.arange(20).reshape(4,5)[i::2] for i in xrange(2)]))) 
Out[30]: 
array([[ 0, 1, 2, 3, 4], 
     [10, 11, 12, 13, 14], 
     [ 5, 6, 7, 8, 9], 
     [15, 16, 17, 18, 19]]) 

編集:ここでは、関数内でより一般化されたバージョンがあります。 Uglierコードですが、この関数は配列といくつかのセグメントを取ります。

In [57]: def break_arr(arr, chunks): 
    ....:  to_take = arr.shape[1]/chunks 
    ....:  return np.array(list(chain(*[arr.take(xrange(x*to_take, x*to_take+to_take), axis=1) for x in xrange(chunks)]))) 
    ....: 

In [58]: arr = np.arange(40).reshape(4,10) 

In [59]: break_arr(arr, 5) 
Out[59]: 
array([[ 0, 1], 
     [10, 11], 
     [20, 21], 
     [30, 31], 
     [ 2, 3], 
     [12, 13], 
     [22, 23], 
     [32, 33], 
     [ 4, 5], 
     [14, 15], 
     [24, 25], 
     [34, 35], 
     [ 6, 7], 
     [16, 17], 
     [26, 27], 
     [36, 37], 
     [ 8, 9], 
     [18, 19], 
     [28, 29], 
     [38, 39]]) 

In [60]: break_arr(arr, 2) 
Out[60]: 
array([[ 0, 1, 2, 3, 4], 
     [10, 11, 12, 13, 14], 
     [20, 21, 22, 23, 24], 
     [30, 31, 32, 33, 34], 
     [ 5, 6, 7, 8, 9], 
     [15, 16, 17, 18, 19], 
     [25, 26, 27, 28, 29], 
     [35, 36, 37, 38, 39]]) 
+0

それでは、もっと大きな整数配列を扱うにはどうすればいいですか? – Chidwack

+0

編集すると少し使いやすくなります。 –

+0

パーフェクト!ありがとうございました – Chidwack