Numpy 入門
モジュールのインポート
import numpy as np
ndarray 1次元配列
a = np.array([1,2,3]) # ndarray 配列
a, a*2
(array([1, 2, 3]), array([2, 4, 6]))
a.ndim # 配列の次元
1
a.shape # 配列のサイズ(要素数)
(3,)
p = [1,2,3] # リスト
p, p*2
([1, 2, 3], [1, 2, 3, 1, 2, 3])
len(p) # 要素数
3
ndarray 2次元配列
aa = np.array([[1,2,3],[4,5,6]]) # ndarrayの2次元配列
aa
array([[1, 2, 3],
[4, 5, 6]])
aa.ndim, aa.shape # 配列の次元,サイズ(要素数)
(2, (2, 3))
ndarray 3次元配列
aaa = np.array([[[1,2],[3,4]],[[5,6],[6,7]]]) # ndarrayの3次元配列
aaa
array([[[1, 2],
[3, 4]],
[[5, 6],
[6, 7]]])
aaa.ndim, aaa.shape # 配列の次元,サイズ(要素数)
(3, (2, 2, 2))
np.zeros(5) # 全ての要素が0の1次元配列
array([0., 0., 0., 0., 0.])
np.zeros((2,4)) # 全ての要素が0の2次元配列
array([[0., 0., 0., 0.],
[0., 0., 0., 0.]])
np.ones(5) # 全ての要素が1の1次元配列
array([1., 1., 1., 1., 1.])
np.empty(4) # 要素無指定の1次元配列
array([0., 0., 0., 0.])
np.empty(3) # 要素無指定の1次元配列
array([1.63437886, 0.55950035, 0.12555924])
np.empty((2,4)) # 要素無指定の2次元配列
array([[0., 0., 0., 0.],
[0., 0., 0., 0.]])
乱数
np.random.rand(5) # 0以上1以下の一様乱数の1次元配列
例えば,
array([0.27537731, 0.46918484, 0.17929417, 0.44969937, 0.86343185])
np.random.rand(2,4) # 0以上1以下の一様乱数の2次元配列
例えば,
array([[0.1007556 , 0.36548795, 0.57395633, 0.15180719],
[0.51545797, 0.36169697, 0.38809973, 0.60301043]])
配列の演算(1次元配列と2次元配列)
a = np.array([3,2,1]) # ndarrayの1次元配列
a*100, a+a, a*a
(array([300, 200, 100]), array([6, 4, 2]), array([9, 4, 1]))
aa = np.array([[1,2,3],[30,20,10]]) # ndarrayの2次元配列
aa
array([[ 1, 2, 3],
[30, 20, 10]])
a.shape, aa.shape # 最後の次元の要素数が一致
((3,), (2, 3))
a+aa
array([[ 4, 4, 4],
[33, 22, 11]])
配列の演算(要素数が一部異なる2次元配列)
b = np.array([[1],[2],[3]])
bb = np.array([[4,-4],[5,-5],[6,-6]])
b,bb
(array([[1],
[2],
[3]]),
array([[ 4, -4],
[ 5, -5],
[ 6, -6]]))
b.ndim, bb.ndim # 配列の次元
(2, 2)
b.shape, bb.shape # 最後の次元の要素数が一致
((3, 1), (3, 2))
b+bb
array([[ 5, -3],
[ 7, -3],
[ 9, -3]])
配列の積
x = np.array([[1,20,300],[4,50,600]])
y = np.array([[1,2],[20,40],[300,600]])
x,y
(array([[ 1, 20, 300],
[ 4, 50, 600]]),
array([[ 1, 2],
[ 20, 40],
[300, 600]]))
x.shape, y.shape
((2, 3), (3, 2))
np.dot(x,y) # 行列の積
array([[ 90401, 180802],
[181004, 362008]])
配列の変形
y.flatten() # 1次元配列に変形
array([ 1, 2, 20, 40, 300, 600])
y2 = y*3
y,y2
(array([[ 1, 2],
[ 20, 40],
[300, 600]]),
array([[ 3, 6],
[ 60, 120],
[ 900, 1800]]))
配列の結合
https://numpy.org/doc/stable/reference/generated/numpy.concatenate.html
np.concatenate([y,y2],axis=0) # 配列の結合
array([[ 1, 2],
[ 20, 40],
[ 300, 600],
[ 3, 6],
[ 60, 120],
[ 900, 1800]])
np.concatenate([y,y2],axis=1) # 配列の結合
array([[ 1, 2, 3, 6],
[ 20, 40, 60, 120],
[ 300, 600, 900, 1800]])
配列の要素に対する計算
a = np.array([3,1,10]) # ndarrayの1次元配列
a
array([ 3, 1, 10])
np.prod(a) # 要素の積
30
np.mean(a) # 要素の平均
4.666666666666667
np.max(a), np.min(a), np.sum(a) # 最大,最小,要素の和
(10, 1, 14)
np.log(a), np.log10(a)
(array([1.09861229, 0. , 2.30258509]),
array([0.47712125, 0. , 1. ]))
np.sqrt(a)
array([1.73205081, 1. , 3.16227766])
b = np.array([-90,-180,-360]) # ndarrayの1次元配列
b
array([ -90, -180, -360])
np.abs(b)
array([ 90, 180, 360])
円周率 $\pi$
np.abs(b)
3.141592653589793
th = -b*np.pi/180.0
th
array([1.57079633, 3.14159265, 6.28318531])
精度を指定することができ,
https://note.nkmk.me/python-numpy-set-printoptions-float-formatter/
np.set_printoptions(suppress=True, precision=3, floatmode='fixed') # ndarrayの精度指定
th
array([1.571, 3.142, 6.283])
また,
st = np.sin(th)
ct = np.cos(th)
tt = np.tan(th)
st, ct, tt
(array([ 1.000, 0.000, -0.000]),
array([ 0.000, -1.000, 1.000]),
array([ 1.633e+16, -1.225e-16, -2.449e-16]))