配列操作の備忘録 [Numpy + Built-in Functions]
はじめに
様々なサイトでまとめられていますが,個人用に基本的な配列操作をまとめます。
pythonの組み込み型として使用できる配列と,numpyをインポートとして使用するnumpy arrayに関して記述します。
配列の作成
# ライブラリ import numpy as np # 配列の作成(1)基本 # Python組み込み型とnumpy array l = ['A', 'B', 'C', 'Z', 'Z'] lnp = np.array(['A', 'B', 'C', 'Z', 'Z']) # 2次元配列(list of list)の場合 l_2d = [['A', 'B'], ['C', 'D', 'E']] lnp_2d = np.array([['A', 'B', 'X'], ['C', 'D', 'Y']]) # *** numpy arrayの場合はdtypeとshapeの指定が重要 lnp_2d = np.array([['A', 'B', 'X'], ['C', 'D']]) # エラー # 配列の作成(2)繰り返しの配列 # 指定した個数(12個)だけ同一要素をくり返す配列 l_r1 = ['A'] * 12 lnp_r1 = np.full(12, 'A') # 指定した値をくり返す lnp_r2 = np.ones(12) # 1をくり返す lnp_r3 = np.zeros(12) # 0をくり返す # 配列の作成(3)繰り返しの配列 # ある配列(l)の要素を指定した個数(12個)だけ繰り返す配列 l_r2 = [l[i % len(l)] for i in range(12)] # 配列の作成(4)等差数列 # 等差数列(0以上,10以下の範囲:要素数12を指定) lnp_s1 = np.linspace(0, 10, 12) # 等差数列(0以上,10未満の範囲:要素数12を指定) lnp_s2 = np.linspace(0, 10, 12, endpoint=False) # 等差数列(0以上,10未満の範囲:公差0.2を指定) lnp_s3 = np.arange(0, 10, 0.2) # 等差数列(0以上,10未満の範囲:公差が整数の場合) l_s3 = [i for i in range(0, 10, 2)] # 配列の作成(5)空の配列 l_emp = [] l_emp = list() lnp_emp = np.empty(12) # np.emptyでは要素数shapeを指定する
要素の指定
# 要素の指定・抽出(1)1次元 # インデックスを指定する(先頭が0) l[0] # インデックスを指定する(負の整数で末尾から数える) l[-1] # インデックスを指定する(1以上から3未満まで = インデックス1と2) l[1:3] # インデックスを指定する(3未満のすべて = インデックス0, 1, 2) l[:3] # インデックスを指定する(1以上のすべて = インデックス1, 2,...) l[1:] # インデックスを指定する(0以上から6未満まで2個ずつ数える=1個飛ばしで) l[0:6:2] # 指定したインデックス以外の要素(numpy arrayを返す) np.delete(l, 2) np.delete(l, [2, 4]) # 要素の指定・抽出(2)2次元 # l_2dの0番目のリストの1番目の要素 l_2d[0][1] # numpy arrayではインデックスによる指定が楽 # インデックスを指定する(行は1番目,列は2番目) lnp_2d[1, 2] # インデックスを指定する(行はすべて,列は2番目) lnp_2d[:, 2] # インデックスを指定する(行はすべて,列は1列飛ばし) lnp_2d[:, ::2]
要素の検索
# 要素の検索 # 配列は指定した値を含むか否か(ブール値を返す) 'A' in l # 配列は指定した値を何個含むか(個数を返す) l.count('A') # 配列は指定した値をどの位置に含むか(最初のインデックスだけを返す) l.index('Z') # 配列は指定した値をどの位置に含むか(すべてのインデックスを返す) [ind for ind, item in enumerate(l) if item == 'Z'] # 配列の長さ # 1次元配列の場合 len(l) lnp.size # 2次元のnumpy arrayに対して,shapeで行列数を取得できる row, col = lnp_2d.shape
要素の追加と削除
# 要素の追加(1)末尾に追加する l.append('X') np.append(lnp, 'X') # *** numpy配列の場合,appendはメソッドとして使えない lnp.append('X') # エラー # 要素の追加(2)位置を指定して追加する l.insert(1, 'Y') np.insert(lnp, 1, 'Y') # 要素の削除(1)全ての要素を削除する l.clear() # 要素の削除(2)指定した要素を削除する # 指定した要素を削除する(リスト先頭から該当する1個のみ) l.remove('Z') # 指定した要素を削除する(リスト中からすべて) [i for i in l if i != 'Z'] # *** numpy arrayではremoveメソッドは使えない lnp.remove('Z') # エラー # 条件式を用いて表現できる(該当箇所すべてを取り除く) lnp[~(lnp=='Z')] # 行列のインデックスを指定して削除する np.delete(lnp_2d, 1, axis=0) # axis=0: 行を削除 np.delete(lnp_2d, [0, 2], axis=1) # axis=1: 列を削除