[NumPy] ユニバーサル関数

[NumPy] ユニバーサル関数

ユニバーサル関数

 NumPy に組込まれている関数はユニバーサル関数 (universal function) とよばれます。ユニバーサル関数は配列 (ndarrayオブジェクト) のすべての要素を操作して配列を返します。たとえば、numpy.sin() は受け取った配列のすべての要素について正弦値を計算します。

# NumPyをインポート
import numpy as np

# 円周率
pi = np.pi

# 配列の定義
x = [pi/3, pi/2, pi]

print(np.sin(x))
[8.66025404e-01 1.00000000e+00 1.22464680e-16]

 
 NumPy には他にも以下のようなユニバーサル関数が用意されています。

 ・絶対値 numpy.abs(), numpy.fabs()
 ・平方根 numpy.sqrt()
 ・指数関数 numpy.exp()
 ・対数関数 numpy.log(), numpy.log10(), numpy.log2()
 ・三角関数 numpy.sin(), numpy.cos(), numpy.tan()
 ・最大値・最小値 numpy.max(), numpy.min()
 ・角度の単位変換 numpy.rad2deg(), numpy.deg2rad()
 

Python関数のユニバーサル化

 numpy.frompyfunc() に Python の関数を渡すと、ユニバーサル関数に変換されます

 numpy.frompyfunc(func, nin, nout)

 func には任意の関数オブジェクトを渡します。
 nin は元の関数の引数の個数、nout は返り値の個数です。

 次のサンプルコードでは bin() をユニバーサル関数に変換します。
 bin() は数値を 2 進数表記の文字列に変換する組み込み関数です。

# NumPyをインポート
import numpy as np

# binをユニバーサル関数に変換
ubin = np.frompyfunc(bin, 1, 1)

# 配列を用意
num = np.array([1, 2, 3, 4, 5])

# numの要素を2進数表記に変換
x = ubin(num)

print(x)
['0b1' '0b10' '0b11' '0b100' '0b101']

 

出力の指定

 すべてのユニバーサル関数 (ufunc) は out 引数で出力を指定することができます。

# NumPyをインポート
import numpy as np

# x = [0 1 2 3 4 5 6 7 8 9]
x = np.arange(10)

# 初期化されていない配列を用意
y = np.empty(10)

# xの各要素の平方根を計算してyに格納
np.sqrt(x, out = y)

print(y)
[0.         1.         1.41421356 1.73205081 2.
 2.44948974 2.64575131 2.82842712 3.        ]

 

numpy.outer()

 すべてのユニバーサル関数 (ufunc) は outer()メソッドを使って、要素間の演算表を作成することができます。たとえば、numpy.multiply関数に outer()メソッドを使うと乗算表を作成することができます。

# x = [1 2 3 4 5 6 7 8 9]
x = np.arange(1, 10)

# 九九の表を作成
y = np.multiply.outer(x, x)

print(y)
[[ 1  2  3  4  5  6  7  8  9]
 [ 2  4  6  8 10 12 14 16 18]
 [ 3  6  9 12 15 18 21 24 27]
 [ 4  8 12 16 20 24 28 32 36]
 [ 5 10 15 20 25 30 35 40 45]
 [ 6 12 18 24 30 36 42 48 54]
 [ 7 14 21 28 35 42 49 56 63]
 [ 8 16 24 32 40 48 56 64 72]
 [ 9 18 27 36 45 54 63 72 81]]