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

NumPyの使い方(ユニバーサル関数)

python 機械学習

NumPyのユニバーサル関数の使い方のメモです。

NumPy

NumPyは数学関数ライブラリです。
インストール方法は下記を参照。
pppurple.hatenablog.com

IPythonで使ってみます。

In [1]: import numpy as np

ユニバーサル関数(ufunc)

ユニバーサル関数(ufunc)はndarrayの各要素に対して演算した結果を戻します。

数学演算

abs
各要素の絶対値を返す。

In [10]: arr2
Out[10]: array([ 0, -1, -2, -3, -4, -5, -6, -7, -8, -9])

In [11]: np.abs(arr2)
Out[11]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

sqrt
各要素の平方根を返す。

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

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

square
各要素の二乗を返す。

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

In [13]: np.square(arr)
Out[13]: array([ 0,  1,  4,  9, 16, 25, 36, 49, 64, 81])

exp
各要素について自然対数eの累乗を返す。

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

In [14]: np.exp(arr)
Out[14]:
array([  1.00000000e+00,   2.71828183e+00,   7.38905610e+00,
         2.00855369e+01,   5.45981500e+01,   1.48413159e+02,
         4.03428793e+02,   1.09663316e+03,   2.98095799e+03,
         8.10308393e+03])

log
各要素の底eの自然対数を返す。

In [17]: arr3
Out[17]: array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

In [18]: np.log(arr3)
Out[18]:
array([ 0.        ,  0.69314718,  1.09861229,  1.38629436,  1.60943791,
        1.79175947,  1.94591015,  2.07944154,  2.19722458,  2.30258509])

log10
各要素の底10の自然対数を返す。

In [17]: arr3
Out[17]: array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

In [19]: np.log10(arr3)
Out[19]:
array([ 0.        ,  0.30103   ,  0.47712125,  0.60205999,  0.69897   ,
        0.77815125,  0.84509804,  0.90308999,  0.95424251,  1.        ])

log2
各要素の底2の自然対数を返す。

In [17]: arr3
Out[17]: array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

In [20]: np.log2(arr3)
Out[20]:
array([ 0.        ,  1.        ,  1.5849625 ,  2.        ,  2.32192809,
        2.5849625 ,  2.80735492,  3.        ,  3.169925  ,  3.32192809])

sign
各要素について、正の場合1、負の場合-1、ゼロの場合は0を返す。

In [22]: arr4
Out[22]: array([-5, -4, -3, -2, -1,  0,  1,  2,  3,  4])

In [23]: np.sign(arr4)
Out[23]: array([-1, -1, -1, -1, -1,  0,  1,  1,  1,  1])

ceil
各要素について小数点以下を切り上げた整数を返す。

In [24]: ran = np.random.randn(10)

In [25]: ran
Out[25]:
array([ 0.13795811, -0.06258411,  0.93709684,  0.58862496, -0.66407519,
       -0.05821423, -0.24729257, -0.32682603, -1.76702714,  1.4629411 ])

In [26]: np.ceil(ran)
Out[26]: array([ 1., -0.,  1.,  1., -0., -0., -0., -0., -1.,  2.])

floor
各要素について小数点以下で最大の整数を返す。

In [25]: ran
Out[25]:
array([ 0.13795811, -0.06258411,  0.93709684,  0.58862496, -0.66407519,
       -0.05821423, -0.24729257, -0.32682603, -1.76702714,  1.4629411 ])

In [27]: np.floor(ran)
Out[27]: array([ 0., -1.,  0.,  0., -1., -1., -1., -1., -2.,  1.])

rint
各要素について丸めた整数を返す。

In [25]: ran
Out[25]:
array([ 0.13795811, -0.06258411,  0.93709684,  0.58862496, -0.66407519,
       -0.05821423, -0.24729257, -0.32682603, -1.76702714,  1.4629411 ])

In [28]: np.rint(ran)
Out[28]: array([ 0., -0.,  1.,  1., -1., -0., -0., -0., -2.,  1.])

modf
要素ごとに整数部と小数部に分けた配列を戻す。

In [29]: ran2 = np.random.randn(10) * 5

In [30]: ran2
Out[30]:
array([  4.34473743,   2.32356206,  -8.6143203 ,  -3.34730069,
         4.95043047,   7.62167946,   5.40291925,   3.51175149,
       -10.65912297,  -1.21207529])

In [31]: np.modf(ran2)
Out[31]:
(array([ 0.34473743,  0.32356206, -0.6143203 , -0.34730069,  0.95043047,
         0.62167946,  0.40291925,  0.51175149, -0.65912297, -0.21207529]),
 array([  4.,   2.,  -8.,  -3.,   4.,   7.,   5.,   3., -10.,  -1.]))

isnan
各要素がNaNかどうかをbool値で返す。

In [36]: ran3
Out[36]:
array([  4.34473743,   2.32356206,          nan,          nan,
         4.95043047,   7.62167946,   5.40291925,   3.51175149,
       -10.65912297,  -1.21207529])

In [37]: np.isnan(ran3)
Out[37]: array([False, False,  True,  True, False, False, False, False, False, False], dtype=bool)

isfinite
各要素についてNaNでもinfでもない場合true、そうでない場合falseを返す。

In [40]: ran3
Out[40]:
array([  4.34473743,   2.32356206,          nan,          inf,
         4.95043047,   7.62167946,   5.40291925,   3.51175149,
       -10.65912297,  -1.21207529])

In [41]: np.isfinite(ran3)
Out[41]: array([ True,  True, False, False,  True,  True,  True,  True,  True,  True], dtype=bool)

isinf
各要素についてinfかどうかをbool値で返す。

In [40]: ran3
Out[40]:
array([  4.34473743,   2.32356206,          nan,          inf,
         4.95043047,   7.62167946,   5.40291925,   3.51175149,
       -10.65912297,  -1.21207529])

In [42]: np.isinf(ran3)
Out[42]: array([False, False, False,  True, False, False, False, False, False, False], dtype=bool)

logical_not
各要素についてfalse値かどうかを判定する。

In [69]: np.logical_not([0, 1, True, False])
Out[69]: array([ True, False, False,  True], dtype=bool)

add
各要素の和を返す。

In [71]: a
Out[71]: array([0, 1, 2, 3, 4])

In [75]: b
Out[75]: array([ 6,  7,  8,  9, 10])

In [76]: np.add(a, b)
Out[76]: array([ 6,  8, 10, 12, 14])

subtract
各要素の差を返す。

In [71]: a
Out[71]: array([0, 1, 2, 3, 4])

In [75]: b
Out[75]: array([ 6,  7,  8,  9, 10])

In [78]: np.subtract(b, a)
Out[78]: array([6, 6, 6, 6, 6])

multiply
各要素の積を返す。

In [71]: a
Out[71]: array([0, 1, 2, 3, 4])

In [75]: b
Out[75]: array([ 6,  7,  8,  9, 10])

In [79]: np.multiply(a, b)
Out[79]: array([ 0,  7, 16, 27, 40])

divide
各要素の商を返す。

In [75]: b
Out[75]: array([ 6,  7,  8,  9, 10])

In [92]: c
Out[92]: array([10, 15, 20, 25, 30])

In [94]: np.divide(c, b)
Out[94]: array([ 1.66666667,  2.14285714,  2.5       ,  2.77777778,  3.        ])

floor_divide
各要素の商の小数点を切り捨てた整数を返す。

In [75]: b
Out[75]: array([ 6,  7,  8,  9, 10])

In [92]: c
Out[92]: array([10, 15, 20, 25, 30])

In [95]: np.floor_divide(c, b)
Out[95]: array([1, 2, 2, 2, 3])

power
1番目の配列の各要素に対して、2番目の各要素の累乗を返す。

In [71]: a
Out[71]: array([0, 1, 2, 3, 4])

In [75]: b
Out[75]: array([ 6,  7,  8,  9, 10])

In [96]: np.power(a, b)
Out[96]: array([      0,       1,     256,   19683, 1048576])

mod
1番目の配列の各要素から、2番目の配列の各要素の剰余を返す。

In [22]: a
Out[22]: array([1, 2, 3, 4, 5])

In [23]: b
Out[23]: array([ 6,  7,  8,  9, 10])

In [25]: np.mod(b, a)
Out[25]: array([0, 1, 2, 1, 0])

copysign
1番目の配列の各要素の符号を、2番目の配列の各要素の符号に変換する。

In [31]: x
Out[31]: array([ 1.83850616, -0.00928144, -0.82975527,  0.87667943, -1.0620178 ])

In [32]: y
Out[32]: array([ 2.04224167, -0.6104846 ,  0.49862891, -0.4277909 , -0.42408569])

In [33]: np.copysign(x, y)
Out[33]: array([ 1.83850616, -0.00928144,  0.82975527, -0.87667943, -1.0620178 ])
三角関数

cos
各要素の余弦を返す。

In [43]: arr
Out[43]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [51]: np.cos(arr)
Out[51]:
array([ 1.        ,  0.54030231, -0.41614684, -0.9899925 , -0.65364362,
        0.28366219,  0.96017029,  0.75390225, -0.14550003, -0.91113026])

sin
各要素の正弦を返す。

In [52]: np.sin(arr)
Out[52]:
array([ 0.        ,  0.84147098,  0.90929743,  0.14112001, -0.7568025 ,
       -0.95892427, -0.2794155 ,  0.6569866 ,  0.98935825,  0.41211849])

tan
各要素の正接を返す。

In [53]: np.tan(arr)
Out[53]:
array([ 0.        ,  1.55740772, -2.18503986, -0.14254654,  1.15782128,
       -3.38051501, -0.29100619,  0.87144798, -6.79971146, -0.45231566])

arccos
各要素の逆余弦を返す。

In [58]: arr5
Out[58]: array([ 0. ,  0.5,  1. ])

In [59]: np.arccos(arr5)
Out[59]: array([ 1.57079633,  1.04719755,  0.        ])

arcsin
各要素の逆正弦を返す。

In [60]: np.arcsin(arr5)
Out[60]: array([ 0.        ,  0.52359878,  1.57079633])

arctan
各要素の逆正接を返す。

In [61]: np.arctan(arr5)
Out[61]: array([ 0.        ,  0.46364761,  0.78539816])

他に、coshsinhtanh、arccosh、arcsinh、arctanhもあり、同様の使い方。

比較演算

greater
各要素を比較する。a > b の結果を返す。

In [35]: a
Out[35]: array([-2, -1,  0,  1,  2])

In [37]: b
Out[37]: array([-3, -2,  0,  2,  4])

In [38]: np.greater(a, b)
Out[38]: array([ True,  True, False, False, False], dtype=bool)

greater_equal
各要素を比較する。a >= b の結果を返す。

In [35]: a
Out[35]: array([-2, -1,  0,  1,  2])

In [37]: b
Out[37]: array([-3, -2,  0,  2,  4])

In [39]: np.greater_equal(a, b)
Out[39]: array([ True,  True,  True, False, False], dtype=bool)

less
各要素を比較する。a < b の結果を返す。

In [35]: a
Out[35]: array([-2, -1,  0,  1,  2])

In [37]: b
Out[37]: array([-3, -2,  0,  2,  4])

In [40]: np.less(a, b)
Out[40]: array([False, False, False,  True,  True], dtype=bool)

less_equal
各要素を比較する。a <= b の結果を返す。

In [35]: a
Out[35]: array([-2, -1,  0,  1,  2])

In [37]: b
Out[37]: array([-3, -2,  0,  2,  4])

In [41]: np.less_equal(a, b)
Out[41]: array([False, False,  True,  True,  True], dtype=bool)

equal
各要素を比較する。a = b の結果を返す。

In [35]: a
Out[35]: array([-2, -1,  0,  1,  2])

In [37]: b
Out[37]: array([-3, -2,  0,  2,  4])

In [42]: np.equal(a, b)
Out[42]: array([False, False,  True, False, False], dtype=bool)

not_equal
各要素を比較する。a != b の結果を返す。

In [35]: a
Out[35]: array([-2, -1,  0,  1,  2])

In [37]: b
Out[37]: array([-3, -2,  0,  2,  4])

In [43]: np.not_equal(a, b)
Out[43]: array([ True,  True, False,  True,  True], dtype=bool)

maximum
各要素同士を比較して大きい方を返す。NaNが含まれている場合、NaNを返す。

In [7]: x
Out[7]: array([-0.78780433,  0.00584326,         nan,  1.00060331, -0.57256836])

In [8]: y
Out[8]: array([ 2.01085585,  0.33302472, -0.62328293,  1.3707416 ,  0.16804423])

In [9]: np.maximum(x, y)
Out[9]: array([ 2.01085585,  0.33302472,         nan,  1.3707416 ,  0.16804423])

fmax
各要素同士を比較して大きい方を返す。NaNが含まれている場合、NaNではない方を返す。

In [7]: x
Out[7]: array([-0.78780433,  0.00584326,         nan,  1.00060331, -0.57256836])

In [8]: y
Out[8]: array([ 2.01085585,  0.33302472, -0.62328293,  1.3707416 ,  0.16804423])

In [10]: np.fmax(x, y)
Out[10]: array([ 2.01085585,  0.33302472, -0.62328293,  1.3707416 ,  0.16804423])

minimum
各要素同士を比較して小さい方を返す。NaNが含まれている場合、NaNを返す。

In [7]: x
Out[7]: array([-0.78780433,  0.00584326,         nan,  1.00060331, -0.57256836])

In [8]: y
Out[8]: array([ 2.01085585,  0.33302472, -0.62328293,  1.3707416 ,  0.16804423])

In [11]: np.minimum(x, y)
Out[11]: array([-0.78780433,  0.00584326,         nan,  1.00060331, -0.57256836])

fmin
各要素同士を比較して小さい方を返す。NaNが含まれている場合、NaNではない方を返す。

In [7]: x
Out[7]: array([-0.78780433,  0.00584326,         nan,  1.00060331, -0.57256836])

In [8]: y
Out[8]: array([ 2.01085585,  0.33302472, -0.62328293,  1.3707416 ,  0.16804423])

In [12]: np.fmin(x ,y)
Out[12]: array([-0.78780433,  0.00584326, -0.62328293,  1.00060331, -0.57256836])

logical_and
各要素の論理積を返す。

In [45]: a
Out[45]: array([ True, False,  True, False], dtype=bool)

In [47]: b
Out[47]: array([ True,  True, False, False], dtype=bool)

In [48]: np.logical_and(a, b)
Out[48]: array([ True, False, False, False], dtype=bool)

logical_or
各要素の論理和を返す。

In [45]: a
Out[45]: array([ True, False,  True, False], dtype=bool)

In [47]: b
Out[47]: array([ True,  True, False, False], dtype=bool)

In [49]: np.logical_or(a, b)
Out[49]: array([ True,  True,  True, False], dtype=bool)

logical_not
各要素の論理否定を返す。

In [45]: a
Out[45]: array([ True, False,  True, False], dtype=bool)

In [47]: b
Out[47]: array([ True,  True, False, False], dtype=bool)

In [50]: np.logical_not(a, b)
Out[50]: array([False,  True, False,  True], dtype=bool)

logical_xor
各要素の排他的論理和を返す。

In [45]: a
Out[45]: array([ True, False,  True, False], dtype=bool)

In [47]: b
Out[47]: array([ True,  True, False, False], dtype=bool)

In [51]: np.logical_xor(a, b)
Out[51]: array([ True,  True,  True,  True], dtype=bool)

終わり。


【参考】
Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理