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

NumPyの使い方(統計関数、集合関数)

python 機械学習

NumPyの統計関数と集合関数の使い方のメモです。

NumPy

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

IPythonで使ってみます。

In [1]: import numpy as np
統計関数

統計関数はndarrayのメソッドとして実行、またはnumpyの関数としても実行できる。

mean
算術平均を算出。

In [2]: arr = np.random.randn(5, 4)

In [3]: arr
Out[3]:
array([[-0.95839481,  0.05124362,  0.65485084,  0.54505791],
       [-1.58525473, -0.32399282,  0.76428108,  0.28883652],
       [-0.03463767, -1.53789016, -0.20222787, -0.8765573 ],
       [ 1.07199473,  0.94943464, -0.61879003, -0.20948927],
       [-1.10662553, -0.70518836, -0.11055268, -0.40102818]])

In [4]: arr.mean()
Out[4]: -0.21724650239347504

In [5]: np.mean(arr)
Out[5]: -0.21724650239347504

mean()にaxisを指定した場合は、その軸の平均値を算出。

In [3]: arr
Out[3]:
array([[-0.95839481,  0.05124362,  0.65485084,  0.54505791],
       [-1.58525473, -0.32399282,  0.76428108,  0.28883652],
       [-0.03463767, -1.53789016, -0.20222787, -0.8765573 ],
       [ 1.07199473,  0.94943464, -0.61879003, -0.20948927],
       [-1.10662553, -0.70518836, -0.11055268, -0.40102818]])

In [6]: arr.mean(axis=1)
Out[6]: array([ 0.07318939, -0.21403249, -0.66282825,  0.29828752, -0.58084869])

sum
配列の合計を算出。

In [3]: arr
Out[3]:
array([[-0.95839481,  0.05124362,  0.65485084,  0.54505791],
       [-1.58525473, -0.32399282,  0.76428108,  0.28883652],
       [-0.03463767, -1.53789016, -0.20222787, -0.8765573 ],
       [ 1.07199473,  0.94943464, -0.61879003, -0.20948927],
       [-1.10662553, -0.70518836, -0.11055268, -0.40102818]])

In [7]: arr.sum()
Out[7]: -4.344930047869501

In [8]: np.sum(arr)
Out[8]: -4.344930047869501

sum()にaxisを指定した場合は、その軸の合計を算出。
下記の例はaxisを省略した記法。

In [9]: arr.sum(0)
Out[9]: array([-2.612918  , -1.56639308,  0.48756135, -0.65318031])

std
標準偏差を算出。

In [9]: data = np.ceil(np.random.rand(10) * 50)

In [10]: data
Out[10]: array([ 13.,  43.,  41.,  21.,  11.,  35.,  42.,  48.,  15.,   4.])

In [11]: np.std(data)
Out[11]: 15.303921066184312

In [17]: data.std()
Out[17]: 15.303921066184312

var
分散を算出。

In [10]: data
Out[10]: array([ 13.,  43.,  41.,  21.,  11.,  35.,  42.,  48.,  15.,   4.])

In [12]: np.var(data)
Out[12]: 234.20999999999998

In [18]: data.var()
Out[18]: 234.20999999999998

min
最小値を算出。

In [10]: data
Out[10]: array([ 13.,  43.,  41.,  21.,  11.,  35.,  42.,  48.,  15.,   4.])

In [13]: np.min(data)
Out[13]: 4.0

In [19]: data.min()
Out[19]: 4.0

max
最大値を算出。

In [10]: data
Out[10]: array([ 13.,  43.,  41.,  21.,  11.,  35.,  42.,  48.,  15.,   4.])

In [14]: np.max(data)
Out[14]: 48.0

In [20]: data.max()
Out[20]: 48.0

argmin
最小値の要素のndarrayのインデックスを返す。

In [10]: data
Out[10]: array([ 13.,  43.,  41.,  21.,  11.,  35.,  42.,  48.,  15.,   4.])

In [15]: np.argmin(data)
Out[15]: 9

In [21]: data.argmin()
Out[21]: 9

argmax
最大値の要素のndarrayのインデックスを返す。

In [10]: data
Out[10]: array([ 13.,  43.,  41.,  21.,  11.,  35.,  42.,  48.,  15.,   4.])

In [16]: np.argmax(data)
Out[16]: 7

In [22]: data.argmax()
Out[22]: 7

cumsum
累積和を算出。
1番目の要素 + 2番目の要素 + 三番目の要素 + … と和が累積されていく。

In [10]: data
Out[10]: array([ 13.,  43.,  41.,  21.,  11.,  35.,  42.,  48.,  15.,   4.])

In [23]: np.cumsum(data)
Out[23]: array([  13.,   56.,   97.,  118.,  129.,  164.,  206.,  254.,  269.,  273.])

In [24]: data.cumsum()
Out[24]: array([  13.,   56.,   97.,  118.,  129.,  164.,  206.,  254.,  269.,  273.])

axisで対象となる軸を指定。
下記の例はaxisを省略した記法。

In [28]: arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])

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

In [30]: arr.cumsum(0)
Out[30]:
array([[ 0,  1,  2],
       [ 3,  5,  7],
       [ 9, 12, 15]])

In [33]: arr.cumsum(1)
Out[33]:
array([[ 0,  1,  3],
       [ 3,  7, 12],
       [ 6, 13, 21]])

cumprod
累積積を算出。
1番目の要素 * 2番目の要素 * 三番目の要素 * … と和が累積されていく。

In [10]: data
Out[10]: array([ 13.,  43.,  41.,  21.,  11.,  35.,  42.,  48.,  15.,   4.])

In [25]: np.cumprod(data)
Out[25]:
array([  1.30000000e+01,   5.59000000e+02,   2.29190000e+04,
         4.81299000e+05,   5.29428900e+06,   1.85300115e+08,
         7.78260483e+09,   3.73565032e+11,   5.60347548e+12,
         2.24139019e+13])

In [26]: data.cumprod()
Out[26]:
array([  1.30000000e+01,   5.59000000e+02,   2.29190000e+04,
         4.81299000e+05,   5.29428900e+06,   1.85300115e+08,
         7.78260483e+09,   3.73565032e+11,   5.60347548e+12,
         2.24139019e+13])

axisで対象となる軸を指定。
下記の例はaxisを省略した記法。

In [31]: arr.cumprod(1)
Out[31]:
array([[  0,   0,   0],
       [  3,  12,  60],
       [  6,  42, 336]])

In [32]: arr.cumprod(0)
Out[32]:
array([[ 0,  1,  2],
       [ 0,  4, 10],
       [ 0, 28, 80]])
集合関数

unique
配列の重複を除外する。

In [49]: chars = np.array(['A', 'B', 'C', 'D', 'A', 'D', 'G'])

In [50]: chars
Out[50]:
array(['A', 'B', 'C', 'D', 'A', 'D', 'G'],
      dtype='<U1')

In [51]: np.unique(chars)
Out[51]:
array(['A', 'B', 'C', 'D', 'G'],
      dtype='<U1')

In [52]: ints = np.array([1, 2, 3, 2, 4, 2, 4])

In [53]: ints
Out[53]: array([1, 2, 3, 2, 4, 2, 4])

In [54]: np.unique(ints)
Out[54]: array([1, 2, 3, 4])

in1d
1番目の引数の配列の各要素が、2番目の引数の配列に含まれるかどうかの真偽値を返す。

In [4]: c1 = np.array(['A', 'B', 'C', 'D', 'A', 'D', 'G'])

In [5]: c2 = np.array(['B', 'C', 'D', 'F', 'G', 'I'])

In [7]: np.in1d(c1, c2)
Out[7]: array([False,  True,  True,  True, False,  True,  True], dtype=bool)

intersect1d
1番目と2番目の引数の配列の共通要素を返す。結果はソートされて返る。

In [4]: c1 = np.array(['A', 'B', 'C', 'D', 'A', 'D', 'G'])

In [5]: c2 = np.array(['B', 'C', 'D', 'F', 'G', 'I'])

In [6]: np.intersect1d(c1, c2)
Out[6]:
array(['B', 'C', 'D', 'G'],
      dtype='<U1')

setdiff1d
1番目の引数の配列の各要素から、2番目の引数の配列に含まれる要素を除外した要素を返す。結果はソートされて返る。

In [4]: c1 = np.array(['A', 'B', 'C', 'D', 'A', 'D', 'G'])

In [5]: c2 = np.array(['B', 'C', 'D', 'F', 'G', 'I'])

In [8]: np.setdiff1d(c1, c2)
Out[8]:
array(['A'],
      dtype='<U1')

setxor1d
1番目と2番目の引数の配列の要素から、共通要素を除いた要素を返す。結果はソートされて返る。

In [4]: c1 = np.array(['A', 'B', 'C', 'D', 'A', 'D', 'G'])

In [5]: c2 = np.array(['B', 'C', 'D', 'F', 'G', 'I'])

In [9]: np.setxor1d(c1, c2)
Out[9]:
array(['A', 'F', 'I'],
      dtype='<U1')

union1d
1番目と2番目の引数の配列の要素をすべて合わせた要素を返す。結果はソートされて返る。

In [4]: c1 = np.array(['A', 'B', 'C', 'D', 'A', 'D', 'G'])

In [5]: c2 = np.array(['B', 'C', 'D', 'F', 'G', 'I'])

In [10]: np.union1d(c1, c2)
Out[10]:
array(['A', 'B', 'C', 'D', 'F', 'G', 'I'],
      dtype='<U1')

終わり。


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