こがねいろ

いろいろ備忘録

配列操作の備忘録 [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: 列を削除