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]))