====== 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>プログラミング}}