====== Python モジュール: numpy ====== ===== 概要 ===== * Python で行列を扱うためのモジュール ===== 使い方 ===== ==== モジュールの読み込み ==== import numpy あるいは import numpy as np * ''as np'' によって、以降 ''np'' で呼び出せる。 * ここではこっちの読み込みをした場合で記述していく。 ==== 行列 ==== === 行列の作成 === * numpy 用の行列データ ''matrix'' を作成する方法 * リストを numpy 用の行列に変換する場合\\ matrix = np.array(list_matrix) * ''list_matrix'': リストで作成した行列 * ゼロ行列を作成する場合\\ matrix = np.zeros([row,col]) * ''row'': 行のサイズ (''0'' を指定することで空の行列を作ることができる) * ''col'': 列のサイズ === 行列の結合 === * 縦に結合 (行を追加)\\ matrix = np.vstack((matrix1, matrix2)) * ''matrix1'', ''matrix2'': 結合する行列データ * 結合する行列データは何個でも指定できる。 * タプルで指定するため、''vstack'' の後は関数用とタプル用の括弧で二重になる。 * 横に結合 (列を追加)\\ matrix = np.hstack((matrix1, matrix2)) * ''matrix1'', ''matrix2'': 結合する行列データ * 結合する行列データは何個でも指定できる。 * タプルで指定するため、''vstack'' の後は関数用とタプル用の括弧で二重になる。 === 行列の抽出 === * 特定の要素を抽出\\ value = matrix[row][col] * ''value'': 抽出した要素を格納する変数 * ''row'': 抽出したい行 (リストと同じく、0 から始まるインデックスを指定) * ''col'': 抽出したい列 (リストと同じく、0 から始まるインデックスを指定) * 特定の要素をスライスで抽出\\ new_matrix = matrix[row_slice][col_slice] * ''new_matrix'': 抽出した行列を格納する変数 * ''row_slice'': 抽出する行を指定するスライス * ''col_slice'': 抽出する列を指定するスライス * リストと同じく、スライス (例: ''[2:5]'') で範囲で抽出することができる。 * 不連続な範囲を抽出\\ new_matrix = matrix[np.array(row_list)][:,np.array(col_list)] * ''new_matrix'': 抽出した行列を格納する変数 * ''row_list'': 抽出したい行のリスト * ''col_list'': 抽出したい列のリスト * 不連続な範囲 (例: ''2,5,8,10'' など) を抽出する場合は、行列データに行列データのインデックスを与える。ここでは、''np.array()'' を使っているが、行列データを指定するのであれば、''np.array()'' を使う必要はない。 * 上記の方法だと * 参考サイト: [[http://oimokihujin.hatenablog.com/entry/2015/10/01/112450 | numpy.arrayによる2次元配列から任意の列を抽出する方法 - おいも貴婦人ブログ]] === ランダムな行列の作成 === * テスト用などに使えるかも。 * 小数の行列 (0〜1 まで)\\ matrix = np.random.rand(SHAPE) * ''SHAPE'': 行列のサイズ (多次元の場合、カンマで区切ってサイズを表記する; 例: ''3,100'') * 整数の行列\\ matrix = np.random.randint([LOW,] HIGH, size = SHAPE) * ''LOW'': 最小値 (オプション) * ''HIGH'': 最大値 (指定した値は含まない) * ''SHAPE'': 行列のサイズ (多次元にする場合はタプルで指定する) * 対称行列 (既に matrix は生成済みの場合)\\ symmetry = (matrix + matrix.T) / 2 np.fill_diagonal(symmetry, 0) * 1 行目で、転置行列と足し合わせて、対称な行列を作成する。 * ''np.fill_diagonal(matrix, var)'' は ''matrix'' の対角成分に ''var'' を代入する関数で、これにより対角成分が 0 になる。破壊的なメソッドなので、元の行列は残らない。 === ゼロ行列の作成 === * 要素すべてが 0 の行列の作成\\ MATRIX = np.zeros(SHAPE, dtype = TYPE) * ''MATRIX'': ゼロ行列を格納する変数 * ''SHAPE'': 行列のサイズ (多次元にする場合はタプルで指定する) * ''TYPE'': 行列の型 === 空の行列の作成 === * 空の行列 (ただし、値は 0 とは限らない) を作成する。\\ NEW_MATRIX = np.empty((ROW, COL), dtype = TYPE) * ''NEW_MATRIX'': 空の行列を格納する変数 * ''ROW'': 生成する行列の行数 * ''COL'': 生成する行列の列数 * ''TYPE'': データ型 * ''dtype'' は省略可 * 既存の行列と同じサイズの空の行列を作成する。\\ NEW_MATRIX = np.empty_like(MATRIX) * ''NEW_MATRIX'': 空の行列を格納する変数 * ''MATRIX'': サイズを参照したい行列 * 参考サイト: [[https://note.nkmk.me/python-numpy-empty-empty-like/ | NumPyで空の配列ndarrayを生成するemptyとempty_like | note.nkmk.me]] === 行列全体のキャスト === * 行列全体のデータ型を変える。\\ NEW_MATRIX = MATRIX.astype(TYPE) * ''NEW_MATRIX'': データ型変換後の行列データを格納する変数 * ''MATRIX'': 変換したい行列データ * ''TYPE'': データ型 * ''np.float'': 浮動小数点型 * ''np.int'': 整数型 === 対角行列の生成 === * 対角成分の配列から、対角行列を生成する。\\ DIAG_MATRIX = np.diagflat(MATRIX1D) * ''DIAG_MATRIX'': 対角行列を格納する変数 * ''MATRIX1D'': 対角成分のみの 1 次行列 * 参考サイト: [[http://d.hatena.ne.jp/gerumanium/20110907/1315403852 | 対角行列の生成 - gerumaniumの日記]] === 対角成分の抽出 === * 行列から対角成分を抽出する。\\ DIAG = np.diag(MATRIX) * ''DIAG'': 対角成分を格納する変数 * ''MATRIX'': 対角成分を抽出したい行列 ==== ヒストグラム ==== * 行列データをヒストグラム分類することもできる。\\ np.histogram(MATRIX, bins = BINS, density = DENSITY_BOOL) * ''MATRIX'': ヒストグラム化したい行列データ (1次元データに変換される) * ''BINS'': ヒストグラムの幅 * int (整数) で指定すると分割数 * リストで指定すると、リストの各要素が各ヒストグラムバーの最小値となる。 * ''"auto"''、''"fd"''、''"doane"''、''"scott"''、''"rice"''、''"sturges"''、''"sqrt"'' を指定すると、各アルゴリズムに合わせた BINS が生成される。詳しくはドキュメントを参照。 * ''DENSITY_BOOL'': 確率表示の有無 * ''True'' を指定すると、0〜1 の確率で表示する。 * ''False'' を指定すると、要素のカウント数で表示する。 * 結果 (numpy の行列データで返される) * 1 番目の結果: ヒストグラム (''DENSITY = True'' の場合は確率) * 2 番目の結果: BINS * 参考サイト: * [[https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.histogram.html | numpy.histogram — NumPy v1.13 Manual]] * [[http://yakumido.blogspot.jp/2014/08/numpy.html | やくみ堂~砂漠から徒歩3分~: numpyとscipyのヒストグラム]] {{tag>プログラミング}}