pythonスクリプトに関するコメント

numpy関連

評価式の結果の代入

scikit-learnのsvc利用スクリプトにある記述

X = np.random.randn(200, 2)
y = X[:, 0] + X[:, 1] > 1

の分解説明

In [1]:
import numpy as np

X = np.random.randn(20,2) # 20行2列のガウス型乱数を発生
X
Out[1]:
array([[-0.0727513 , -0.73959047],
       [ 0.82177159, -0.64134464],
       [-0.87012001, -0.35351073],
       [-1.14234857,  0.59276961],
       [-0.17239936,  0.83471209],
       [-0.38418383, -0.55066044],
       [ 1.61044888,  1.61282833],
       [-0.98522697, -0.07125534],
       [-1.52283278, -0.09177313],
       [-0.22261503, -0.99960702],
       [-0.39008617, -1.56654023],
       [ 0.93003971, -1.59429504],
       [ 0.52367093,  1.14456125],
       [ 0.87108574,  1.04747884],
       [-2.44540509,  1.89342096],
       [ 1.21101806,  1.02148725],
       [-0.28800701, -0.08372841],
       [ 2.15151194, -0.62448477],
       [ 1.75769996,  0.29736606],
       [ 0.17607642, -2.49711851]])
In [2]:
# 上記の各行の1列の値と2列の値の和が1より大きいかどうかの評価式を左辺に書く
# 行はコロンだけ書くと各行について連続計算する
y = X[:, 0] + X[:, 1] > 0
y
Out[2]:
array([False,  True, False, False,  True, False,  True, False, False,
       False, False, False,  True,  True, False,  True, False,  True,
        True, False])
In [8]:
#上記を平たくプログラムで表す
y = np.zeros(20, dtype=bool) # dtypeを指定しないと整数として扱われる true=1, false=0
for i in range(20):
    if X[i,0] + X[i,1] > 1:
        y[i] = True
    else:
        y[i] = False
y
Out[8]:
array([False, False, False, False, False, False,  True, False, False,
       False, False, False,  True,  True, False,  True, False,  True,
        True, False])

配列の次元追加:ベクトル(1次元配列)からn行1列の配列へ

In [9]:
x = np.linspace(0., np.pi*2., 10) # 10個の要素をもつ1次元配列
x
Out[9]:
array([0.        , 0.6981317 , 1.3962634 , 2.0943951 , 2.7925268 ,
       3.4906585 , 4.1887902 , 4.88692191, 5.58505361, 6.28318531])
In [10]:
X = x[:, np.newaxis] # 2次元配列へ (10行1列)
X
Out[10]:
array([[0.        ],
       [0.6981317 ],
       [1.3962634 ],
       [2.0943951 ],
       [2.7925268 ],
       [3.4906585 ],
       [4.1887902 ],
       [4.88692191],
       [5.58505361],
       [6.28318531]])
In [16]:
y = X.T # 転置 ⇒ 1行10列
y
Out[16]:
array([[0.        , 0.6981317 , 1.3962634 , 2.0943951 , 2.7925268 ,
        3.4906585 , 4.1887902 , 4.88692191, 5.58505361, 6.28318531]])