

102×102の行列を17×17の行列に分割したいです。  
102行列は行列の番号がふってあるので、  
読み込んだときにDataframeから配列になおしました。  
102行列を読み込むことはできましたが、分割はどのようにしたらいいでしょうか。  
分割はsplitを使えばいいのですか？  
よろしくお願いします。

行列を読み込むところまでのコードは以下のように書いています。

[code]

    dfs=[]
    for filename in filenames:
        #print(filename)
        df=pd.read_csv(filename,index_col=0)
        #print(df)
    
        a_df = df.values
        print(a_df)
        print(a_df.shape)
    
[/code]


CC BY-SA 4.0
2018-10-16T11:36:16.000
49352
2018-10-17T00:08:00.960
2018-10-16T11:53:14.993
19110
30443
question
python array
2次元配列を分割したい


`a_df` は NumPy array
なので、[`np.split`](https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.split.html)
を 2 段階で使ってブロック行列を作るように実装してみました。

サンプルコードです：

[code]

    block_size = 6
    block_num = 17
    size = block_size * block_num
    arr = np.array([[i * j for j in range(size)] for i in range(size)])
    h_arr = np.split(arr, block_num, axis=0)
    hv_arr = [np.split(elm, block_num, axis=1) for elm in h_arr]
    
[/code]

`np.split` は NumPy array のリストを返します。そこでまずは縦方向に切ってから、それぞれの部品を縦方向に切ることで、NumPy
array のリストのリストを作っています。

また、他の方法が本家 Stack Overflow への投稿 [Slice 2d array into smaller 2d
arrays](https://stackoverflow.com/q/16856788/5989200)
にまとまっているのも見つけましたので参考までにリンクします。


CC BY-SA 4.0
2018-10-16T12:30:16.650
49355
2018-10-16T12:30:16.650
19110
49352
answer


numpyのスライシングだけを使って行列を分割してみました。

[code]

    def func1(arr, block_size, block_num):
        size = block_size * block_num
        result = []
        for row in range(0, size, block_size):
            block = []
            for col in range(0, size, block_size):
                block.append(arr[row:row+block_size, col:col+block_size])
            result.append(block)
        return result
    
[/code]

内包表記を使うと

[code]

    def func2(arr, block_size, block_num):
        size = block_size * block_num
        return [[arr[row:row+block_size,col:col+block_size] for col in range(0, size, block_size)]　for row in range(0, size, block_size)]
    
[/code]

Google Colab で処理時間を測ると、func1 が 115µs、func2 が 107µsでした。np.split
を使ったものは、470µsでした。


CC BY-SA 4.0
2018-10-17T00:08:00.960
49365
2018-10-17T00:08:00.960
15171
49352
answer