NumPyには、数値計算を目的としたライブラリであるため、あらかじめ数学関数が数多く用意されています。NumPyの数学関数を知っていると、自分で実装する手間が省けます。
そこで、この記事を読めば一通りよく使う関数を把握することができるように、NumPyの数学関数を中心に使い方を紹介します。
四則演算
まずは基本的な四則演算を紹介します。四則演算はPythonにある+
,-
,+
,/
の4つの演算子を適用することができます。この場合、配列の各要素に対して演算が行われることになります。
どのshape
同士のndarrayを計算することができるかは、NumPyのブロードキャストで詳しく解説しているので、以下の記事を参考にしてください。
NumPyのブロードキャストのメリットと解説 /features/numpy-broadcasting.html
四則演算に相当するNumPyの関数(np.add()
など)がありますが、ndarrayの配列操作であることを明示したい場合以外にはあまり使用されません。
足し算(np.add)
足し算です。特別な関数とかはなく、演算子の+
を用います。配列の要素同士の足し算ができるだけでなく、配列の各要素に同じ値を加算することも可能です。
引き算(np.subtract)
引き算も全く同様に-
演算子で処理することが可能です。
掛け算(np.multiply)
掛け算は、*
演算子を用いて計算します。この場合、配列同士のそれぞれ対応する要素同士の掛け算を行います。外積や内積といったベクトルや行列の演算とは違い、アダマール積と呼ばれる成分同士の演算なので注意してください。
割り算・剰余(np.divide, np.mod)
割り算は/
演算子を使います。また、商を整数にしたい場合はPython3の演算子と同様に//
とスラッシュを2回続けて使うとできます。剰余を求めたいときは%
を使います。全てPythonと同じ演算子なので直感的に演算することができます。
剰余(%)と同じことはnp.mod()
でもすることができる。
累乗(np.power)・平方根(np.sqrt)
累乗はnp.power(x, t)
でを求められます。また、Pythonのビルトイン演算子と同様にx**2
で求めることも可能です。平方根を求めたいときはnp.sqrt(x)
で求めることができます。
三角関数
以下では、三角関数の基本であるサイン、コサイン、タンジェントからその逆関数、また度からラジアンへ変換する関数などを紹介します。引数としてndarrayを指定することができます。
三角関数(np.sin, np.cos, np.tan)
NumPyにはサイン、コサイン、タンジェントを計算する関数も実装されています。それぞれ、np.sin()
,np.cos()
,np.tan()
を使います。また、円周率を示すnp.pi
もあります。
引数には、degreeではなくradianを指定します。
逆三角関数(np.arcsin, np.arccos, np.arctan)
三角関数の逆関数もNumPyの関数として存在します。関数名の頭にarc
が付きます。逆関数なので、例えばarcsin
はsin(x)=y
のとき、x
の値を求めたかったらarcsin(y) = x
として求めることができます。
ここでも出力される値はdegreeではなくradianになります。
ラジアンと度の相互変換
NumPyで実装されている三角関数系の関数は基本的にradianで操作されます。そのため、度をラジアン、ラジアンを度に変換する関数が必要になります。関数を使わなくても、をかければラジアンに変換することができ、をかければ度に変換することができますが、この操作をする関数が分かりやすいように用意されています。
そこで、NumPyではnp.rad2deg()
がdegreeへの変換として存在し、np.radians()
とnp.deg2rad()
がラジアンへの変換用の関数として存在しています。
実行速度も比べてみましょう。
1.44マイクロ秒と、1.43マイクロ秒なのでほとんど差はありません。
指数関数、対数関数
指数関数
指数関数のなかでもネイピア数 を底(base)とするものがNumPyでは実装されています。のことです。
これはnp.exp(x)
で計算することが可能です。ネイピア数自体はnp.e
で出すことができます。
ネイピア数に関しての詳しい解説は以下のサイトでされているので参考にしてみてください。
ネイピア数eの定義がなぜあの形か、先生は説明をしてくれなかった
対数関数
対数関数は底が特殊な場合のみ用意されています。
- 底がネイピア数e
np.log(x)
- 底が2
np.log2(x)
- 底が10
np.log10(x)
- log(1 + x)を計算(底はe)
np.log1p(x)
底を他の値に変えたい時は、その変えたい底を真数とする対数で割ります。
双曲線関数(hyperbolic)
双曲線関数とは、以下のように定義される2つの関数からできる一連の関数のことです。
sinhはハイパボリックサイン、coshはハイパボリックコサインなどと呼ばれます。
また、tanh(ハイパボリックタンジェント)は
のように定義されます。
形は全く違いますが、これらの関数は三角関数と似た性質をいくつか示すため、sin, cos, tanのような語がついてきています。
詳しい解説は以下のサイトを参照してください。
高校数学の基本問題
これもNumPyの関数として呼び出すことが可能です。
逆関数としてnp.arcsinh(x)
,np.arccosh(x)
,np.arctanh(x)
も存在します。
切り捨て、切り上げ、四捨五入
概数を求めるメソッドには、以下のようなものがあります。
- 切り捨て
np.floor()
- 切り捨て
np.trunc()
- 切り上げ
np.ceil()
- 四捨五入
np.round()
- 四捨五入
np.around()
- 四捨五入
np.rint()
- 0に近い方向で整数をとる
np.fix()
複素数
NumPyは複素数も扱うことができます。虚部のところにj
を添えるだけです。また、複素数に関する関数として実部を返すnp.real()
,虚部を返すnp.imag()
,複素共役(虚部の符号を反転させたもの)を返すnp.conj()
があります。
複素数は、音波の位相やコンピューターグラフィックスでよく使われるクォータニオンなどに便利な概念です。
絶対値
絶対値をとる関数もあります。これには2つあって、np.fabs
とnp.absolute()
があります。np.absolute()
の略記でnp.abs()
もあります。配列を引数として指定すると各要素の絶対値が返されます。この2つの関数の違いは複素数を引数として指定できるか否かです。
np.absolute()
は複素数の絶対値を返すことができます。np.fabs()
はできません。
数学的な定数の呼び出し
最後に数学でよく用いられる定数としてNumPyに設定されているものをみていきましょう。
どうやらeとπしかなさそうです。
どちらも呼び出す時は()
を必要とはしません。
定数 |
NumPyでの関数 |
ネイピア数e |
np.e |
円周率π |
np.pi |