Pythonのメモ帳

numpy, pandas, tensorflow を使いこなすための忘備録

マトリクス形式 (配列) から スプレッド形式 (表) に変換するときも numpy.meshgrid が役立つ

マトリクス形式(配列)のデータをスプレッド形式(表)に変換したい場合がある。

 

例えば下のような配列を、、

 [[0.36363082, 0.00332102, 0.14533355],
 [0.11039035, 0.95780551, 0.48281694],
 [0.44771602, 0.94823649, 0.36095112]]

 

↓ こんなふうな表にしたいという意味。

 
row
col
val
0 0 0 0.190805
1 0 1 0.599887
2 0 2 0.209723
3 1 0 0.105745
4 1 1 0.219456
5 1 2 0.198315
6 2 0 0.671719
7 2 1 0.537687
8 2 2 0.012490

 

工夫なしに書くとこんなコードになる。

import numpy as np
import pandas as pd

# テストデータ
mat = np.random.rand(3,3)

# スプレッドシート形式に変更                
cols, rows, vals = [],[],[]
for row in range(mat.shape[0]):
    for col in range(mat.shape[1]):
        rows.append(row)
        cols.append(col)
        vals.append(mat[row,col])
                
df = pd.DataFrame()
df['row'] = rows
df['col'] = cols
df['val'] = vals

 

これにはもっと高速にできる方法があって、npのmeshgridという関数を使う。これを使うとfor構文が不要になり、コードもシンプル。

# スプレッドシート形式に変更 
rows,cols = np.meshgrid(range(mat.shape[0]),range(mat.shape[1]),indexing='ij') df = pd.DataFrame() df['row'] = rows.flatten() df['col'] = cols.flatten() df['val'] = mat.flatten()

 

ちなみにこれ、前回書いた内容とやってる事はほとんど同じで、使い道がちがうだけでした。

spcx8.hatenablog.com