numpy – 配列要素の演算

要素に対するスカラー演算

配列の要素に対するスカラー演算は、それぞれの要素に作用。

二次元配列も同じ。

なお、配列が後ろに来ても要素ごとに演算。

要素ごとの演算

同じ形状の配列同士の演算は、それぞれの要素ごとの演算。

要素ごとの比較

配列同士の比較は、要素ごとの比較結果の配列。

関数演算

numpyの関数の引数が配列の場合、要素ごとの演算結果となる。

 

numpy – ファイルの保存と読み込み

バイナリファイル

バイナリファイルとしての保存にはnp.save()、その読み込みにはnp.load()を使う。基本的なオプションは以下の通り。

numpy.save("ファイル名", 配列)
配列 = numpy.load("ファイル名")

注意点として、ファイルの拡張子は.npy固定。

  • saveのファイル名に拡張子をつけない場合、自動的に拡張子.npyが付加される
  • saveのファイル名に別の拡張子を書いても、その後ろに.npyが付加される
  • loadのファイル名の拡張子は.npyでなければならない(違う場合はFileNotFoundError)

テキストファイル

概要

テキストファイルとしての保存にはnp.savetxt()、その読み込みにはnp.loadtxt()を使う。扱える配列の次元は1次元か2次元のみ。基本的なオプションは以下の通り。

numpy.savetxt(
    fname,         # ファイル名を任意の拡張子まで指定
    X,             # 書き込む配列
    fmt='%.18e',   # 書き込む書式
    delimiter=' ', # 行内の数値の区切り
    newline='n',   # 改行文字
    header='',     # ヘッダー文字列
    footer='',     # フッター文字列
    comments='# ', # コメントの開始文字
    encoding=None  # エンコーディング
)

numpy.loadtxt(
    fname,                 # ファイル名(拡張子まで)
    dtype=<class 'float'>, # データの型
    comments='#',          # コメント開始文字
    delimiter=None,        # 区切り文字(デフォルトはスペース)
    converters=None,
    skiprows=0,            # ファイル先頭から指定した行数だけ読み飛ばす
    usecols=None,          # タプルで指定した列のみ読み込み
    unpack=False,
    ndmin=0,
    encoding='bytes'max_rows=None)

なお、numpy.ndarrayはすべての要素の型が同じでなければならず、リストやタプルのように要素の型を混在させることはできない

数値データ

数値データのみを扱う場合、整数でも自動的に実数型に変換されて読み込まれる。

実行例

このときのファイルの内容は以下のようになっている。

3次元以上の配列を書き込もうとするとエラー。

文字列

文字列データについては、書き込む場合はfmt="%s"、読み込む場合にはdtype="unicode"を指定。

このとき、text.txtファイルの中は以下のようになっている。

CSVファイルの読み込み

以下のようなCSVファイルを配列に読み込む。

numpy.arrayはすべての要素の型が同じである必要があるため、上記のように文字列と数値が混在したファイルを一つの配列に読み込もうとするとエラーになる。

都道府県名と2次元のデータを別々に読み込むことは可能。

読み込み時にUnicodeエラーが出た場合

ファイル読み込み時に以下のようなエラーが出た場合。

引数にencoding='utf8'を指定して回避。

その他のメソッド

savez()/load()
複数のファイルを非圧縮で扱う。
savez_compressed()/load()
複数のファイルを圧縮して扱う
ndarray.tofile()
配列のストレージへの書き込み。

 

ndarray – 配列の生成

リテラル

要素をリテラルで指定する。

2次元配列は行列形式できれいに表示されるが、3次元以上は1行表示になる。

リストでもタプルでも結果は同じ。

自動生成

配列形状を指定して全要素を特定の値で埋める

全要素が0、1の配列

numpy.zeros(shape, [dtype=None], [order='C'])
numpy.ones(shape, [dtype=None], [order='C'])

引数はどちらも同じで、配列形状、データタイプ、行列優先の指定。

多次元配列を生成する場合、配列のサイズをタプルとして引数に渡す。

全要素の数値を指定

numpy.full(shape, fill_value, [dtype=None], [order='C'])]

他の配列と同じ形状で特定の値を埋める

全要素が0、1の配列

numpy.zeros_like(a, [dtype=None], [order='C'])
numpy.ones_like(a, [dtype=None], [order='C'])

全要素の値を指定

numpy.full_like(a, fill_value, [dtype=None], [order='C'])]

 初期化せず配列枠だけ確保する

zeros()ones()と同じで、配列の形だけを確保するが各要素は初期化しない。

この場合も多次元配列ではサイズのタプルを引数で渡す。

配列形状を(1, 1)で指定すると、1要素の2次元配列が確保される。

配列形状を数値0で指定すると、空の配列が確保される。

配列形状で0の次元が含まれると空の配列になる。

内包表記

リストの内包表記が使える。

range()関数

普通にrange()関数も使える。

numpy.arange()~間隔を指定

numpy.arrange([start=0], stop, [step=1], [dtype=None])

numpy.arange()関数はrange()関数よりも高速な生成が可能。

range()関数と同じようにパラメータを設定。dtypeはデータ型を指定。

range()関数は整数しか引数に指定できないが、numpy.arange()関数はfloatの指定が可能。

numpy.linspace()~分割数を指定

numpy.linspace(start, stop, [num=50], [endpoint=True], [retstep=False], [dtype=None])

初期値と終了値を指定して、その間を等分割したリストを返す。分割数を指定しないとデフォルトで50分割。基本の型はfloat。

この分割数は区間数ではなく、生成される数列の個数である点に注意。以下の例では0~1の間で10個の数値を生成させるため、区間数は9となる(植木算の考え方)。

デフォルトでは終端値を含めるが、含めないようにもできる。

生成された数列と分割幅のタプルを返すことができる。

特定の行列の生成

numpy.identity()~単位行列

numpy.identity(n)

正方行列の1辺の要素数を指定して、単位行列を生成する。

numpy.tri()~下三角行列の生成

numpy.tri(n)

左下の要素が1の下三角行列を生成する。

numpy.tril()numpy.triu()~行列の三角化

numpy.tril(matrix)
nunmpy.triu(matrix)

与えられた行列を下三角/上三角化。

numpy – 配列操作 – 抽出

概要

配列の要素や行・列の抽出などに関する操作。

準備として、以下の1次元、2次元配列を考える。

要素の参照

1次元配列の要素の参照は、リストと同じ。

2次元配列の要素は、[行, 列]で指定。行・列の値の考え方は1次元配列の要素と同じ。

行・列の参照

単一の行・列の参照

2次元配列の行の参照は、行番号を指定。

2次元配列の列の参照はややこしくて、[:,列番号]で指定。1つ目の:は行番号のプレースホルダーみたいなものか。

ただし、列を取り出した結果でも、1次元の配列になる。

直接列ベクトルで取り出したい場合は、[:,列番号:列番号+1]で可能。

なお、1次元の配列にndarray.Tを作用させても、1次元配列のままで列ベクトルにはならない。

範囲を指定した行・列の参照

行の範囲を指定して、複数行の行列を返す。

列の範囲を指定する場合。

複数の行・列を指定した参照

連続しない複数の行を取り出した行列をつくるには、[行番号, 行番号, …]とする。

複数列を取り出す場合。

参照であることの注意

以上の操作で取り出された配列は、元の配列への参照を保っているため、その要素を変更すると元の配列の要素も変更される。

元の配列に影響させたくない場合は、copy.copy()、copy.deepcopy()、np.copy()でオブジェクトをコピーする必要がある。

対角要素の取り出し

np.diag()で、2次元配列の対角要素を取り出した1次元配列が得られる。

ただし、その結果は書き込みできない。

条件を指定した取り出し

配列に条件式を適用して、各要素が要件に合致していればTrue、合致していなければFalseを要素とする配列を返す。

上で得られた配列を要素とすることで、条件に合致した要素のみを取り出した1次元配列を得る。

 

Python3 – numpyのインストール

numpyのインストールは、コマンドラインからpipで。numpyのインストール後にpipのアップグレードを推奨されたので、これも実行。