Pythonのメモ帳

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

2次元配列の値を行番号や列番号に依存させたい場合、meshgrid()を使って高速化

2次元配列を作るときに、中身の値を行番号や列番号に依存させたい場合がある。

つまり↓のような関係が成り立つようにしたい。

2次元配列の値 = 関数( 行番号, 列番号 )

 

普通に書くとこうなる。

import numpy as np

# 配列作成
nrows = 10
ncols = 10
mat = np.empty([nrows,ncols])

for row in range(nrows):
    for col in range(ncols):
        mat[row,col] = row + col

ここでは配列の値 =  行番号 + 列番号 となるようにしている。

このコードで作ったmatを一応可視化すると、

f:id:spcx8:20180909113636p:plain

右下に行くほど値が大きくなっている。

 

そしてもっといい方法がこちら。
 numpy にはmeshgridという便利な関数が用意されていて、forを使わずに書くことができる。

# 配列作成
nrows = 10
ncols = 10

rows,cols = np.meshgrid(range(nrows),range(ncols), indexing=’ij’)
mat = rows + cols 

結果は同じなので割愛。

 

ちなみに、meshgridを使うと処理速度も改善できる。というかmeshgridを使うのはこれが目的だったりする。

nrows, ncols ともに 10,000の場合で計測した結果、

- 前述のコード(for2段階) 31.6 sec

- 後述のコード(meshgrid) 1.8 sec

とその差は明らか。自分でfor構文を書くのは極力やめた方がいいらしい。