読者です 読者をやめる 読者になる 読者になる

すこしふしぎ.

VR/HI系院生による技術ブログ.まったりいきましょ.(友人ズとブログリレー中.さぼったら焼肉おごらなきゃいけない)

numpy使い方_3_関数まとめ

python numpy

引き続きnumpyの使い方をごにょごにょ勉強していきます. numpyには様々な便利関数が用意されています. ツールとして便利に使えるようにするため,どのような関数が用意されているのかを把握することは重要です. 詳細はリファレンスページを見てもらうとして,どのような場面で使えそうな関数があるかをまとめてみます. 前回はファンシーインデックスと言いましたがあまり書くことがなかったのでかえましたw

目次

大別すると,次のような感じでしょうか.

  • 数学関数
  • 線形代数
  • 論理関数
  • 日付関数
  • 統計関数
  • 経済関数
  • その他

またnumpyには通常の関数とは別にndarrayと親和性の高いユニバーサル関数という関数があります. こちらについてもちょっと説明します.

ではいきます.

数学関数(Mathematical Function)

リファレンスはこちら

リファレンスによると,次のようなカテゴリに分けられそうです.

カテゴリ 詳細
三角関数 sin,cos,tanにはじまりarcsin,radtodegなど
双曲線関数 sinh,cosh,tanh,arcsinh,arccosh,arctanh
桁丸め round,rintfix,floor,ceil,trunc
総和演算 ΣやΠなど.配列状データ
指数・対数関数 exp,log
四則演算 四則演算・余り・逆数・累乗・合同式など
複素数処理 実部・虚部・偏角の取得.共役の計算
その他 sqrt,max/min,fabsなど上に当てはまらない処理.クリッピング・線形補完もある

いわゆる基本的な 数学関数を利用したい場合は,ここのページのリファレンスから探すのが良さそうです.

線形代数(Linear Algebra)

リファレンスはこちら

線形代数の関数を利用する際にはnp.linalgを参照する必要があります. linear algebraの略ですね. npだけで参照しようとするとエラーになるので注意が必要です.

リファレンスによると,次のようなカテゴリに分けられそうです.

カテゴリ 詳細
行列・ベクトル積算 数学における行列・ベクトルの積算.内積外積テンソル等.
分解 コレスキー分解・QR分解・SVD
固有値 固有値固有ベクトルを計算する
ノルム等 ||A||,detA.trA など
逆行列・ソルバ A-1の計算.Ax=bをxについて解く.疑似逆行列も扱える

線形代数で習ったような処理がいろいろありますね. 分解って何につかうんだっけ... 宿題解く時にnp.linalg.eig()使って固有値計算したこともありますが, 分数値にはならないので1/3とかが出るとダメだったことを思い出します.

みつけた面白い関数として,アインシュタインの縮約記法を評価する関数がありました. 電磁気やら熱力やらで習うようなヤツですね. 例えば3次元だと,

ai * bi = a1 * b1 + a2 * b2 + a3 * b3

とう感じ. 同項内で同じ添字について和をとり,異なる添字なら行列になるやつですね,懐かしい. これをコードする際,そのままダミーインデックスを与えて評価させることができるのです. こんな感じ.

# 4次vector2つ
In [1]: a = arange(4)

In [2]: b = arange(5,9)

In [3]: b
Out[3]: array([5, 6, 7, 8])

# いわゆる内積
In [4]: dot(a,b) # inner(a,b)でもok
Out[4]: 44

# a_i * b_i
In [5]: einsum('i,i',a,b) # a,bについてのindexを,区切りで与えている
Out[5]: 44

# a_i * b_j = A_ij
In [6]: einsum('i,j',a,b)
Out[6]:
array([[ 0,  0,  0,  0],
       [ 5,  6,  7,  8],
       [10, 12, 14, 16],
       [15, 18, 21, 24]])

学術書読みながらコードに落とし込む時に使えるかもしれません!笑

論理関数(Logic function)

リファレンスはこちら

リファレンスによると,次のようなカテゴリに分けられそうです.

カテゴリ 詳細
真偽判定 all,anyによるTrueかFalseの判定
値判定 isfinite, isinf, isnan, isneginf, isposinfの判定.finiteはinf,nan以外ならok
型判定 iscomplex, iscomplexobj, isfortran, isreal, isrealobj, isscalarの判定
論理演算 and, or, not, xorの演算
比較演算 =,>,<=,など

論理演算は論理回路のシミュレーションに使えるかな. 自分はisfortranは使うことなさそうだなぁ.

日付関数(Datetime Support Function)

リファレンスはこちら

リファレンスによると,特にカテゴリ分けすることはなさそうです. 基本的にはpythonの組み込みモジュールであるtimeやdatetimeを使います.

numpyにはサポートとして,business day functionというのが用意されていました. 指定した日が営業日かどうかを判定したり,指定期間に営業日が何日あるかを判定することもできます.

...つかわなそうですねw

統計関数(statistics)

リファレンスはこちら

リファレンスによると,次のようなカテゴリに分けられそうです.

カテゴリ 詳細
古い統計 min/max. パーセンタイル等
平均・分散 平均・メジアンの計算に標準偏差,分散の計算.nanを無視した計算もできる
相関 相関係数,相互相関関数,共分散
ヒストグラム ヒストグラムの計算.指定範囲の標本数取得など

meanは数学関数でも簡単に計算できますが,varianceやcorrelationの計算は便利ですね. 機械学習の本を読み進める際にはぜひ使っていきたいところです.

ビジュアライズする際にはヒストグラムなど便利でしょう. matplotlibと併せてうまく使っていけたらと思います.

データ分析においては統計関数の使い方はマスターしないとですね,論理的な意味で. 統計の本などまた読み直そうかなぁ.

経済関数(Financial Functions)

リファレンスはこちら

経済関数の中でのカテゴリ分けは特になさそうです. simple financial functionsということで紹介されていますので,簡単なモデルをシミュレートしてくれるのでしょうか.

一番上に書いてあったnp.fv(rate, nper, pmt, pv, when='end')関数をちょっと見てみます.future valueの略だそうです. 各引数の意味は次の通り.

  • rate: periodごとに増えるレート
  • nper(number of copunding period): シミュレート期間
  • pmt(payment): periodごとに払う値
  • pv(present value): 現在の値
  • when: paymentの発生タイミング.'Start','end'かユーザ指定.デフォルトは'end'

計算モデルは次.

fv +
pv*(1+rate)**nper +
pmt*(1 + rate*when)/rate*((1 + rate)**nper - 1) == 0

...ふむ.

経済分野ってよくわからないのでよくわからないです...

その他

その他にも以下が便利そうです.

  • 入出力関数(input and output)
  • 配列生成(array creation routine)
  • ランダムサンプリング(Random sampling)
  • 多項式(polynominal)
  • 離散フーリエ変換(Discrete Fourier Transform)
  • 文字列処理(string operation)

自分でC連携する際にはC-APIを利用するとよいみたいです, しばらくはその必要はなさそうなので触らないでおきますが.

ユニバーサル関数

リファレンスはこちら

ユニバーサル関数(以下ufunc)とは,ndarrayを引数にとり,要素すべてを対象とし処理を行う関数のことです. 例えばndarray中のすべての要素のルートを計算したり,絶対値を取得したりということを,ループを書かずに一瞬でできてしまいます. こんなかんじで.

In [1]: a = arange(8).reshape(2,4)

In [2]: a
Out[2]:
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])

In [3]: sqrt(a)
Out[3]:
array([[ 0.        ,  1.        ,  1.41421356,  1.73205081],
       [ 2.        ,  2.23606798,  2.44948974,  2.64575131]])

各要素についてそれぞれ計算するので,当然出力は入力ndarrayと同一サイズのndarrayとなります. イメージとしては関数がブロードキャストされている感じですね.

そして先ほど紹介した関数の中に,ufuncとしてつかえるものが多くあります. リファレンスページの下の方,available ufunc以降にufuncとして利用できる関数のリストがありました.

そこでは次のようにカテゴリ分けがされています.

  • Math operation(数学処理 ex. add, sqrt, log)
  • Trigonometric functions(三角関数 ex. sin, arccos, rad2deg)
  • Bit-twiddling functions(ビット演算関数 ex.bitwize_and, invert, left_shift)
  • Comparison functions(比較関数 ex. equal, greater, less)
  • Floating functions(float向け? ex. isreal, mod, ceil)

簡単な数学処理をループ不要でお手軽に書けるようにしたもの,という認識で大丈夫だと思います. 自分で使ってみるのが一番でしょう.

まとめ

numpyで使われる関数群を俯瞰してみました. データ分析の観点からはmathematical functions, linear algebra, statisticsあたりの関数の利用シーンを押さえておくと良さそうです.

そいでは今日はこの辺で.