スタートページJavaScript他言語Python 目次>    ←文字列の取扱とprint関数  →配列の部分指定と行・列の追加

配列の生成と要素表現

Python 自体は配列の一括処理の概念がありませんので、配列データを用いる処理は Python の拡張モジュールである NumPy や Pandas などを追加した環境で行うのが通常です。
配列には、Python の list、NumPy の ndarray、Pandas の DataFrame があります。それぞれ異なる特徴があり、それに関する関数も異なります。Python のプログラミングでは、これをよく理解することがポイントになります。
ここでは、それら配列の入力方法と構造、要素の表現形式、list、ndarray、DataFrame間の変換を扱います。


list ndarray DataFrame

PythonNumPyPandas
配列名称listndarrayDataFrame
通常の次元ベクトル(一次元)行列(二次元)行列(二次元)
属性混在混在任意同一属性(flort)列内では同一属性
インポート略称nppd
ここでの変数名mlistmarraydf

配列の生成

配列の入力による生成

●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 とするのが通常です。

CSVファイルからの読込み

    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 では、行列は横ベクトルのベクトルとして定義されます。

list

listベクトル

●初期設定
  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

list行列

●初期設定
  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 が便利です。

ndarray

import numpy as np が必要

ndarrayベクトル

●初期設定
  varray = np.array([10, 11, 12, 13])
●諸元
  次元数:varray.ndim()    # 1
  形状:  varray.shape()   # (4,)
  長さ:  len(varray)      #  4

ndarray行列

●初期設定
  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でもよい

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

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

list ⇔ ndarray ⇔ DataFrame 変換

ndarray は全要素が同一属性(float)という制約があります。整数要素は自動的に変換されますが、文字列要素が存在するときは変換できません。列(行)を選択して変換する必要があります。それには「配列の部分指定と行・列の追加」を参照してください。

list → ndarray

  marray = np.array(mlist)

ndarray → list

  mlist = marray.tolist()
    mlist = list(marray) とすると次のような結果になります。
    [array([0, 1, 2, 3]), array([10, 11, 12, 13]), array([20, 21, 22, 23])]

list → df

  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

df → np.array、list

  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']