Python – 2-3.numpy –

配列の演算

初期値

nary1 = np.arange(6).reshape(2,3)
nary2 = np.ones((2,3))
nary3 = np.ones((3,2))
nary4 = np.full((2,3) ,2)

加算

nary1 + nary2
==> array([[1., 2., 3.],
           [4., 5., 6.]])

減算

nary1 - nary2
==> array([[-1.,  0.,  1.],
           [ 2.,  3.,  4.]])

乗算

np.dot(nary1, nary3)
==> array([[ 3.,  3.],
           [12., 12.]])

転置(T)

nary1.T
==> array([[0, 3],
           [1, 4],
           [2, 5]])

四則計算

加算(add)

np.add(nary1, nary2)
==> array([[1., 2., 3.],
           [4., 5., 6.]])

減算(subtract)

np.subtract(nary1, nary2)
==> array([[-1.,  0.,  1.],
           [ 2.,  3.,  4.]])

乗算(multiply)

np.multiply(nary1, nary4)
==> array([[ 0,  2,  4],
           [ 6,  8, 10]])

除算(divide)

np.divide(nary1, nary4)
==> array([[0. , 0.5, 1. ],
           [1.5, 2. , 2.5]])

累乗 (power)

np.power(2,3)
==> 8

nary1 = np.arange(6).reshape(2,3)
np.power(nary1,3)
==> array([[  0,   1,   8],
           [ 27,  64, 125]], dtype=int32)

平方根 (sqrt)

np.sqrt(9)
==> 3.0

np.sqrt(np.array([[4,9,16], [25,36,49]]))
==> array([[2., 3., 4.],
           [5., 6., 7.]])

三角関数 (np.sin、np.cos、np.tan)

※引数となる角度はラジアン単位で指定。ラジアンはnp.radiansで取得可能
例)45度の場合
np.radians(45) = 45 * np.pi / 180 = 0.7853981633974483
例)90度の場合
np.radians(90) = 90 * np.pi / 180 = 1.5707963267948966
例)180度の場合
np.radians(180) = 180 * np.pi / 180 = 3.141592653589793
・ 角度=ラジアン=0のとき
np.sin(np.radians(0))
==> 0.0
np.cos(np.radians(0))
==> 1.0
np.tan(np.radians(0))
==> 0.0
・リストで複数を同時に指定することも可能
np.sin(np.radians([0,30,45,90]))
==> array([0.        , 0.5       , 0.70710678, 1.        ])
np.cos(np.radians([0,30,45,90]))
==> array([1.00000000e+00, 8.66025404e-01, 7.07106781e-01, 6.12323400e-17])
np.tan(np.radians([0,30,45,90]))
==> array([0.00000000e+00, 5.77350269e-01, 1.00000000e+00, 1.63312394e+16])
・πが無理数で小数点以下の桁数が大きくなるためnp.roundで四捨五入
np.round(np.sin(np.radians([0,30,45,90])), 3)
==> array([0.   , 0.5  , 0.707, 1.   ])
np.round(np.cos(np.radians([0,30,45,90])), 3)
==> array([1.   , 0.866, 0.707, 0.   ])
np.round(np.tan(np.radians([0,30,45,60])), 3)  # 90は無限大なので
==> array([0.   , 0.577, 1.   , 1.732])

ソート関数(np.sort, np.argsort)

普通のソート

nary = np.array([6,2,0,9,7,4])
==> array([6, 2, 0, 9, 7, 4])
np.sort(nary)
==> array([0, 2, 4, 6, 7, 9])

二次元配列のソート

nary = np.array([[6,0,7],[9,7,3]])
==> array([[6, 0, 7],
           [9, 7, 3]])

※デフォルトは行ごとにソート
np.sort(nary)
==> array([[0, 6, 7],
           [3, 7, 9]])

列ごと(縦方向)にソート

np.sort(nary, axis=0)
==> array([[6, 0, 3],
           [9, 7, 7]])

※デフォルトはaxis=1
np.sort(nary, axis=1)
==> array([[0, 6, 7],
           [3, 7, 9]])

argsort ソートした際の、元の値のINDEXを返す

nary = np.array([[6,0,7],[9,7,3]])
np.argsort(nary)
==> array([[1, 0, 2],
           [2, 1, 0]], dtype=int32)

欠損値np.nanの扱い

nan値の代入

## 明示的に欠損値NaNを生成したいときはnp.nanやfloat('nan')などを使う
nary = np.ones((2,3))
nary[0,0]=9
nary[1,1]=np.nan
nary[1,2]=float(np.nan)

==> array([[ 9.,  1.,  1.],
           [ 1., nan, nan]])

nan値の判定

・np.isnan
True if np.isnan(nary[1,1]) else False
==> True
・"=="では判定不可
True if nary[1,1] == np.nan else False
==> False
・math.isnan
True if math.isnan(nary[1,1]) else False
==> True
・np.nan_to_num()で他の値に置換
True if np.isnan(np.nan_to_num(nary[1,1], 999)) else False
==> False

nanを含むndarrayの集計

nary = array([[  0.,   1.,  nan, 512.],
              [  1.,   2.,  nan, 128.],
              [  2.,   3.,  nan, 256.],
              [  3.,   4., 999.,   4.]])
・nansum()でnanを含むndarrayの合計算出
np.nansum(nary)
==> 1915.0
==> (0+1+2+3+1+2+3+4+999+512+128+256+4) = 1915
・axis=0 で列毎の合計
np.nansum(nary, axis=0)
==> array([  6.,  10., 999., 900.])
==> (1+2+3 = 6, 1+2+3+4 = 10, 999, 512+128+256+4 = 900)
・axis=1 で行毎の合計
np.nansum(nary, axis=1)
==> array([ 513.,  131.,  261., 1010.])
==> (1+512 = 513, 1+2+128 = 131, 2+3+256 = 261, 3+4+999+4 = 1010)

合計と同様に、最大、最小、平均、分散、標準偏差関数が用意されている
np.nanmean(), np.nanmax(), np.nanmin(), np.nanstd(), np.nanvar()

・最大
np.nanmax(nary)
==> 999.9

・最小
np.nanmin(nary)
==> 0.0

・平均
np.nanmean(nary)
==> 147.30769230769232

・分散
np.nanvar(nary)
==> 81540.82840236685

・標準偏差
np.nanstd(nary)
==> 285.553547346845

2021-12-15

Posted by tfurukaw