2-3. numpy ndarrayの演算
import numpy as np
配列の演算
※初期値の作成
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のとき
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