スタートページ> JavaScript> 他言語> Python 目次> ←文字列の取扱とprint関数 →配列の部分指定と行・列の追加
Python 自体は配列の一括処理の概念がありませんので、配列データを用いる処理は Python の拡張モジュールである NumPy や Pandas などを追加した環境で行うのが通常です。
配列には、Python の list、NumPy の ndarray、Pandas の DataFrame があります。それぞれ異なる特徴があり、それに関する関数も異なります。Python のプログラミングでは、これをよく理解することがポイントになります。
ここでは、それら配列の入力方法と構造、要素の表現形式、list、ndarray、DataFrame間の変換を扱います。
Python | NumPy | Pandas | |
配列名称 | list | ndarray | DataFrame |
通常の次元 | ベクトル(一次元) | 行列(二次元) | 行列(二次元) |
属性混在 | 混在任意 | 同一属性(flort) | 列内では同一属性 |
インポート略称 | np | pd | |
ここでの変数名 | mlist | marray | df |
●Python の list mlist = list([['a', 1, 2, 3], あるいは単に mlist = [['a', 1, 2, 3], [ 10,'b',12, 13], [ 10,'b',12, 13], [ 20, 21,'c',23]]) [ 20, 21,'c',23]] ●NumPy の ndarray import numpy as np # NumPy を使えるようにインポートして、その略称を np とする marray = np.array([[ 0, 1, 2, 3], [10,11,12, 13], [20,21,22,23]]) ●Pandas の DataFrame import pandas as pd # Pandas の機能を使うには、pd.DataFrame のようにする df = pd.DataFrame([['A', 1, 2, 3], # df のイメージ(RDBに似ている) ['B',11,12,13], # c0 c1 c2 c3 ['C',21,22,23]], # r0 'A' 1 2 3 columns = ['c0','c1','c2','c3'], # 列名 r1 'B' 11 12 13 index = ['r0','r1','r2']) # 行名 r2 'C' 21 22 23 index を省略すると、1, 2, 3 … が自動的に付けられます。 一つのプログラム中では DataFrame が1個のことが多く、その名称を df とするのが通常です。
df = pd.read_csv('CSVファイルのURL') 実務では、Excel などで作成したデータを、多目的に使うCSVファイルとして持ち、それを DataFrame として読み込むのが通常です。 (他形式のファイルも読めます) read_table テキストファイル(txt) read_excel Excelファイル(xlsx, xls) read_json JSON文字列・ファイルを読み込み list や ndarray として読むこともできます。 CSVファイルは、UTF-8 の文字コード体系です。 空白区切りでもよいが、コンマ区切りの形式が通常です。 文字列要素は ' ' で囲んでおきます。 全体を読むのではなく、行や列を指定して読み込んだり、行と列を転置して読み込んだりできますが、ここでは省略します。 df.to_csv('CSVファイルのURL') のようにファイルに書き出すこともできます。
ここでは、変数名を次のように決めています。 総称 list ndarray DataFrame ベクトル v vlist varray 行列 m mlist marray df ●要素の表記法 要素番号の先頭は0からです。 各要素はベクトルでは v[i] のように表記します。 行列では、2通りの表現があります。 list ndarray df m[i][j] 〇 〇 × m[i,j] × 〇 〇 (dt.iat[0,0] の表記になる) list と ndarray では、行列は横ベクトルのベクトルとして定義されます。
●初期設定 vlist = list([10, 11, 12, 13]) vlist = [10, 11, 12, 13] # としても同じ list(10, 11, 12) はエラー ●要素の確認 vlist[0] # 10 vlist[1] + vlist[2] # 23 (=11+12) ●諸元 len(vlist) # 4 ベクトル長さ=要素数 length ではない ●同じ値を繰り返す vlist = [0] * 3 # [0, 0, 0] vlist = [0, 1, 2] * 2 # [0,1,2, 0,1,2] ●range 整数の連続値を入れる 形式1 range(kmax) 形式2 range(kmin, kmax, dk) # (k=kmin; k
●初期設定
mlist = [[ 0, 1, 2, 3], # 行3×列4の行列
[10,11,12,13],
[20,21,22,23]]
●ベクトルを並べて行列にする
v0 = [ 0, 1, 2, 3]
v1 = [10,11,12,13]
v2 = [20,21,22,23]
mlist = [v0, v1, v2]
●要素の確認
mlist[0][0] # 0
mlist[1][2] + mlist[2][0] # 32 (=12+20)
mlist[1,2] # エラー
●諸元
len(m) # 3 行数
len(mlist[0]) # 4 列数
●同じ値を繰り返す
mlist = [[0] * 3] * 4 # エラーになる
mlist = [[0] * 3 for k in range(3)] # k は任意。このようにforで各行を生成する
# [[10, 0, 0], [0, 0, 0], [0, 0, 0]]
このような特殊な行列を生成するには Numby ndarray が便利です。
import numpy as np が必要
●初期設定 varray = np.array([10, 11, 12, 13]) ●諸元 次元数:varray.ndim() # 1 形状: varray.shape() # (4,) 長さ: len(varray) # 4
●初期設定 marray = np.array([ [ 0, 1, 2, 3], [10,11,12,13], [20,21,22,23] ]) ●要素の確認 marray[1][2] # 12 marray[1][2] + marray[2][0] # 32 (=12+20) marray[1,2] # 12 このような形式でもよい marray[1,2] + marray[2,0] # 32 (=12+20) ● 諸元 次元数:marray.ndim() # 2 形状:marray.shape=() # (3, 4) 行長:len(marray) # 3 ●ベクトルのベクトルとして行列を作成できる marray = np.array(v0,v1,v2) # vはlistでもndarrayでもよい
●np.zeros(配列.shape) 全要素を0にする varray = np.zeros(4) # array([0., 0., 0., 0.]) marray = np.zeros((3, 4)) # array([[0., 0., 0., 0.], # [0., 0., 0., 0.], # [0., 0., 0., 0.]]) ●np.onss(配列.shape) 全要素を1にする varray = np.ones(4) # array([1., 1., 1., 1.]) marray = np.ones((3, 4)) # array([[1., 1., 1., 1.], # [1., 1., 1., 1.], # [1., 1., 1., 1.]]) ●np.array() 同じ値を繰り返す varray = np.array([2] * 3) # array[2, 2, 2] listでは v = [2] * 3 varray = np.array([0, 1, 2] * 2) # array[0,1,2, 0,1,2] listでは v = [0,1,2] * 2 ●range() 連続値を入れる listでの range に似ている range(kmax) range(kmin, kmax, dk) varray = np.array(range(5)) # array([0, 1, 2, 3, 4]) ●np.arange() 連続値を入れる varray = np.arange(4) # array([0, 1, 2, 3]) # 4は含まない varray = np.arange(2, 4) # array([2, 3]) varray = np.arange(1, 9, 2) # array([1, 3, 5, 7]) ●np.eye(行数) 単位行列 marray = np.eye(3) # array([[ 1., 0., 0.], # [ 0., 1., 0.], # [ 0., 0., 1.]]) ●np.diag(np.array([1, 2, 3])) 3×3の正方行列の対角要素をarray値とする marray = np.diag(np.array([1, 2, 3])) # array([[1, 0, 0], # [0, 2, 0], # [0, 0, 3]])
DataFrameの構造
c0 c1 c2 c3 ← columns 列名 ベクトル
r0 A 1 2 3 ┐
r1 B 11 12 13 ├ values 要素 行列
r2 C 21 22 23 ┘
↑
index 行名 ベクトル
●要素の表示形式
df.index[i] # 行名
df.columns[j] # 列名
df[i][j] # エラー
df[i,j] # エラー
df.iat[i,j] # 番号で与える iat は iloc でもよい
df.iat[i][j] # エラー
df.at['r0','c0'] # 行名、列名で与える at は iloc でもよい
df.at[0,'c0'] # エラー iatにしてもエラー
このように要素単体での処理を Pandas で記述するのは煩雑です。
いったん ndarray に変換するほうが便利です。
●列の表示方式
DataFrame を対象にした処理では、列ベクトル(縦ベクトル)を対象にすることが多いので、
列ベクトルの表示が簡潔にできます。連想配列と似た形式になります。
df['c1'] # 列名が c1 の列ベクトル [[1],[11],[21]] が指定されます
df.c1 # 同上
df.c1[0] # その列ベクトルの行番号が 0 の要素、すなわち 1 になります。
DataFrame は、列名による列ベクトル(縦ベクトル)を対象に処理するのが基本だから、それに従えば、列順に入力することになります。
import pandas as pd df = pd.DataFrame({'c0': ['A','B','C'], # 列名: 各行の値のリスト 'c1': [ 1, 11, 21], # 列の要素(縦方向) 'c2': [ 2, 12, 22], 'c3': [ 3, 13, 23]}, index = ['r0','r1','r2']) # 行名称を与える # c0 c1 c2 c3 # r0 A 1 2 3 # r1 B 11 12 13 # r2 C 21 22 23
通常は、一つの行を一つのデータとして認識しているのが通常です。それに従った入力をしても、内部では列順に入力したのと同じ構造になります。通常はこの形式で入力します。
import pandas as pd df = pd.DataFrame([['A', 1, 2, 3], # list形式で1行づつ指定 ['B',11,12,13], ['C',21,22,23]], columns = ['c0','c1','c2','c3'], # 列名 省略時は 0, 1, 2 となる index = ['r0','r1','r2']) # 行名 省略時は 0, 1, 2 となる 確認 結果は「列順に入力する場合」と同じ df.iat[0,0] # A df.iat[1,1] + df.iat[2,2] # 33 (=11+22) df.at['r0','c0'] # A df.at['r1','c1'] + df.at['r2','c2'] # 33 indexを省略したとき 行名称がないので、行番号になる。 df = pd.DataFrame([['A', 1, 2, 3], ['B',11,12,13], ['C',21,22,23]], columns = ['c0','c1','c2','c3']) # c0 c1 c2 c3 # 0 A 1 2 3 # 1 B 11 12 13 # 2 C 21 22 23
ndarray は全要素が同一属性(float)という制約があります。整数要素は自動的に変換されますが、文字列要素が存在するときは変換できません。列(行)を選択して変換する必要があります。それには「配列の部分指定と行・列の追加」を参照してください。
marray = np.array(mlist)
mlist = marray.tolist()
mlist = list(marray) とすると次のような結果になります。
[array([0, 1, 2, 3]), array([10, 11, 12, 13]), array([20, 21, 22, 23])]
marray = np.array([ 0, 1, 2, 3], # いったん ndarray に変換 [10,11,12,13], [20,21,22,23]]) vc = ['c0','c1','c2','c3'] vr = ['r0','r1','r2'] df = pd.DataFrame(marray, columns=vc, index=vr) # c0 c1 c2 c3 # r0 0 1 2 3 # r1 10 11 12 13 # r2 20 21 22 23
marray = df.to_numpy()
# array([[ 0, 1, 2, 3],
# [10, 11, 12, 13],
# [20, 21, 22, 23]])
df.columns # Index(['c0', 'c1', 'c2', 'c3'], dtype='object')
list(df.columns) # ['c0', 'c1', 'c2', 'c3'] # np.array にするのは面倒
list(df.index) # ['r0', 'r1', 'r2']