1. Numpy ndarray を使う
import numpy as np
1.1. 初期化しないベクトル(内容は不定)
np.empty(10)
array([0.54296942, 0.98085815, 0.52797689, 0.09862195, 0.60034229,
0.86971354, 0.82463765, 0.13218043, 0.36232667, 0.3283693 ])
1.2. 0.0 を n 個含むベクトルを定義する
a = np.zeros(10)
a
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
1.3. 0.1 を n 個含むベクトルを定義する
a = np.repeat(0.1, 10)
a
array([0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1])
1.4. 要素を同じ回数繰り返すベクトルを定義する
np.repeat(np.array([0.2, 0.3, 0.5, 0.7]), 5)
array([0.2, 0.2, 0.2, 0.2, 0.2, 0.3, 0.3, 0.3, 0.3, 0.3, 0.5, 0.5, 0.5,
0.5, 0.5, 0.7, 0.7, 0.7, 0.7, 0.7])
np.tile(np.array([0.2, 0.3, 0.5, 0.7]), 5)
array([0.2, 0.3, 0.5, 0.7, 0.2, 0.3, 0.5, 0.7, 0.2, 0.3, 0.5, 0.7, 0.2,
0.3, 0.5, 0.7, 0.2, 0.3, 0.5, 0.7])
1.5. 要素を指定回数繰り返すベクトルを定義する
a = np.repeat([0.2, 0.3, 0.5, 0.7], [2, 3, 5, 7])
a
array([0.2, 0.2, 0.3, 0.3, 0.3, 0.5, 0.5, 0.5, 0.5, 0.5, 0.7, 0.7, 0.7,
0.7, 0.7, 0.7, 0.7])
1.6. 等差数列
1.6.1. 公差 1
np.array(range(10))
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
1.6.2. 初項指定,末項指定,公差指定
np.arange(10, 15, 0.5)
array([10. , 10.5, 11. , 11.5, 12. , 12.5, 13. , 13.5, 14. , 14.5])
1.6.3. 初項指定,末項指定,長さ指定
np.linspace(0, 10, 6)
array([ 0., 2., 4., 6., 8., 10.])
np.linspace(0, 10, 7)
array([ 0. , 1.66666667, 3.33333333, 5. , 6.66666667,
8.33333333, 10. ])
1.7. 等比数列
np.logspace(0, 4, num = 5, dtype=int)
array([ 1, 10, 100, 1000, 10000])
np.logspace(0, 5, num = 6, base=3)
array([ 1., 3., 9., 27., 81., 243.])
1.8. 2次元配列
1.8.1. 二重リストで定義
np.array([[1, 2, 3], [4, 5, 6]])
array([[1, 2, 3],
[4, 5, 6]])
1.8.2. ベクトルを返す関数で次元ごとのサイズを指定する
n = 5
# リストで書くと [[False]*n for i in range(n)] のようなものを
[[False]*n for i in range(n)]
[[False, False, False, False, False],
[False, False, False, False, False],
[False, False, False, False, False],
[False, False, False, False, False],
[False, False, False, False, False]]
np.empty((3, 5))
array([[ 0. , 0. , 1. , 0.0625, 0.25 ],
[ 1. , 1. , 1. , 1. , 5.0625],
[ 2.25 , 1. , 16. , 4. , 1. ]])
np.full((3, 2), 5)
array([[5, 5],
[5, 5],
[5, 5]])
np.zeros((5, 5), dtype=bool)
array([[False, False, False, False, False],
[False, False, False, False, False],
[False, False, False, False, False],
[False, False, False, False, False],
[False, False, False, False, False]])
np.ones((5, 5), dtype=bool)
array([[ True, True, True, True, True],
[ True, True, True, True, True],
[ True, True, True, True, True],
[ True, True, True, True, True],
[ True, True, True, True, True]])
1.9. 行・列を指定してソートする
1.9.1. sort メソッドはインプレース
e = np.array([[4, 3, 5], [1, 2, 1], [2, 3, 2]])
e.sort(axis=1)
e
array([[3, 4, 5],
[1, 1, 2],
[2, 2, 3]])
e.sort(axis=0)
e
array([[1, 1, 2],
[2, 2, 3],
[3, 4, 5]])
np.sort はインプレースではない
e = np.array([[4, 3, 5], [1, 2, 1], [2, 3, 2]])
np.sort(e)
array([[3, 4, 5],
[1, 1, 2],
[2, 2, 3]])
e
array([[4, 3, 5],
[1, 2, 1],
[2, 3, 2]])
1.10. 単位行列
np.identity(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
1.11. 対角行列
np.eye(3, 2)
array([[1., 0.],
[0., 1.],
[0., 0.]])
np.eye(3, 5)
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.]])
np.diag(np.array([1, 2, 3, 4]))
array([[1, 0, 0, 0],
[0, 2, 0, 0],
[0, 0, 3, 0],
[0, 0, 0, 4]])
1.11.1. 対角成分に代入
r = np.reshape(np.arange(1, 10), (3, 3))
diag2 = np.eye(3) == 1
r[diag2] = 999
print(r)
[[999 2 3]
[ 4 999 6]
[ 7 8 999]]
1.12. 三角行列
1.12.1. 要素が 1 の下三角行列
np.tri(3)
array([[1., 0., 0.],
[1., 1., 0.],
[1., 1., 1.]])
np.tri(3, 5, 2, dtype=int)
array([[1, 1, 1, 0, 0],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1]])
1.12.2. 対角からk要素下
np.tri(3, 5, -1)
array([[0., 0., 0., 0., 0.],
[1., 0., 0., 0., 0.],
[1., 1., 0., 0., 0.]])
1.12.3. 代入
r = np.reshape(np.arange(1, 10), (3, 3))
p = np.reshape(np.arange(1, 10)*100, (3, 3))
lower = np.tri(3) == 1
r[lower] = p[lower]
print(r)
[[100 2 3]
[400 500 6]
[700 800 900]]
1.12.4. 下三角行列の抽出
a = np.reshape(np.arange(1, 10), (3,3))
print(a)
[[1 2 3]
[4 5 6]
[7 8 9]]
print(np.tril(a))
[[1 0 0]
[4 5 0]
[7 8 9]]
print(np.tril(a, -1))
[[0 0 0]
[4 0 0]
[7 8 0]]
1.12.5. 上三角行列の抽出
a = np.reshape(np.arange(1, 10), (3,3))
print(a)
[[1 2 3]
[4 5 6]
[7 8 9]]
print(np.triu(a))
[[1 2 3]
[0 5 6]
[0 0 9]]
print(np.triu(a, 1))
[[0 2 3]
[0 0 6]
[0 0 0]]
1.12.6. 三角行列の要素の抽出
y = np.array([[1,1,1], [2,2,2], [3,3,3]])
print(y)
[[1 1 1]
[2 2 2]
[3 3 3]]
a = np.triu(np.ones_like(y), 1) > 0
print(a)
[[False True True]
[False False True]
[False False False]]
print(y[a])
[1 1 2]
1.13. 対角要素
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(a)
[[1 2 3]
[4 5 6]
[7 8 9]]
np.diag(a)
array([1, 5, 9])
1.14. メッシュグリッド
a, b = np.meshgrid([1,2,3], [4,5,6,7])
print(a)
[[1 2 3]
[1 2 3]
[1 2 3]
[1 2 3]]
print(b)
[[4 4 4]
[5 5 5]
[6 6 6]
[7 7 7]]
1.15. 全ての行要素,列要素の変更
a = np.arange(12)
b = a.reshape((3, 4))
print(b)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
b[1] = 100
print(b)
[[ 0 1 2 3]
[100 100 100 100]
[ 8 9 10 11]]
b[:, 2] = 200
print(b)
[[ 0 1 200 3]
[100 100 200 100]
[ 8 9 200 11]]
1.16. 配列の連結
a = np.array([1.0, 2.0, 3.0])
b = np.array([5.0, 6.0, 7.0])
np.vstack((a, b))
array([[1., 2., 3.],
[5., 6., 7.]])
np.hstack((a, b))
array([1., 2., 3., 5., 6., 7.])
x = np.array([[1, 2, 3], [4, 5, 6]])
y = np.array([[10, 11, 12], [20, 21, 22]])
np.vstack((x, y))
array([[ 1, 2, 3],
[ 4, 5, 6],
[10, 11, 12],
[20, 21, 22]])
np.hstack((x, y))
array([[ 1, 2, 3, 10, 11, 12],
[ 4, 5, 6, 20, 21, 22]])
np.concatenate((a, b))
array([1., 2., 3., 5., 6., 7.])
np.concatenate(([a], [b]))
array([[1., 2., 3.],
[5., 6., 7.]])
np.concatenate((x, y), axis=0)
array([[ 1, 2, 3],
[ 4, 5, 6],
[10, 11, 12],
[20, 21, 22]])
np.concatenate((x, y), axis=1)
array([[ 1, 2, 3, 10, 11, 12],
[ 4, 5, 6, 20, 21, 22]])
np.c_[a, b]
array([[1., 5.],
[2., 6.],
[3., 7.]])
np.r_[a, b]
array([1., 2., 3., 5., 6., 7.])
np.c_[x, y]
array([[ 1, 2, 3, 10, 11, 12],
[ 4, 5, 6, 20, 21, 22]])
np.r_[x, y]
array([[ 1, 2, 3],
[ 4, 5, 6],
[10, 11, 12],
[20, 21, 22]])
1.17. 配列の分割
a = np.arange(12).reshape(3, 4)
np.split(a, 2, axis=1)
[array([[0, 1],
[4, 5],
[8, 9]]),
array([[ 2, 3],
[ 6, 7],
[10, 11]])]
x, y = np.split(a, 2, axis=1)
x
array([[0, 1],
[4, 5],
[8, 9]])
y
array([[ 2, 3],
[ 6, 7],
[10, 11]])
x, y, z = np.split(a, [1, 3], axis=1)
x
array([[0],
[4],
[8]])
y
array([[ 1, 2],
[ 5, 6],
[ 9, 10]])
z
array([[ 3],
[ 7],
[11]])
x, y = np.split(a, [1], axis=0)
x
array([[0, 1, 2, 3]])
y
array([[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
1.18. 逆転
a = np.array([2, 1, 2, 3, 4, 5, 3])
a[::-1]
array([3, 5, 4, 3, 2, 1, 2])
1.19. 任意の要素から無作為抽出
np.random.choice(['a', 'b', 'c'], 10)
array(['c', 'b', 'b', 'a', 'c', 'a', 'c', 'b', 'b', 'b'], dtype='<U1')
1.20. 配列をシャッフルする
a = np.arange(10)
a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.random.shuffle(a)
a
array([9, 4, 3, 2, 8, 5, 7, 6, 1, 0])
1.21. 整数乱数配列
np.random.randint(0, 5, 10) # [0, 5)
array([2, 3, 0, 1, 4, 1, 4, 4, 4, 0])
np.random.randint(0,6, (4, 6))
array([[5, 1, 0, 0, 5, 5],
[3, 2, 1, 4, 4, 3],
[2, 2, 5, 3, 2, 5],
[5, 2, 1, 4, 1, 4]])
1.22. 一様乱数配列
np.random.rand(5)
array([0.77652573, 0.66557185, 0.24269832, 0.58326534, 0.45768616])
np.random.rand(4, 5)
array([[0.33821307, 0.7982781 , 0.75849507, 0.47283488, 0.77677102],
[0.33283041, 0.3547948 , 0.5136131 , 0.41986897, 0.25914676],
[0.80811828, 0.06705775, 0.67246877, 0.10392812, 0.84117669],
[0.00656908, 0.92959769, 0.17285006, 0.7929529 , 0.39475123]])
1.23. 正規乱数配列
np.random.normal(0, 1, 5) # μ,σ,n
array([-1.64930951, -1.54775496, -0.14741955, 2.19361774, -0.25132001])
np.random.normal(50, 10, (4, 5))
array([[41.37826507, 52.11736377, 67.4529769 , 47.30894323, 44.86792191],
[62.78798789, 36.03928626, 60.61663526, 48.52174999, 35.82257121],
[48.1838473 , 39.77767396, 43.03464413, 33.12420759, 64.05057324],
[56.75662169, 30.12300927, 47.425552 , 48.92858433, 44.39202913]])
1.24. 標準正規乱数配列
np.random.randn(5) # n, (μ=0,σ=1)
array([-1.64930951, -1.54775496, -0.14741955, 2.19361774, -0.25132001])
np.random.randn(4, 5)
array([[ 0.56668756, 0.65459934, -0.83598793, -0.80786311, -1.42285691],
[-0.79637241, -1.49401664, 1.14888839, -1.38985433, -0.21149632],
[ 0.05892271, 0.06737828, 1.46461575, -0.21965432, 0.47423523],
[ 0.58777079, 1.17415001, 0.86777467, -0.43134558, -0.50830685]])
1.25. 横ベクトル
1×n 行列である。
np.array([[1, 2, 3, 4, 5]])
array([[1, 2, 3, 4, 5]])
np.zeros((1, 5))
array([[0., 0., 0., 0., 0.]])
1.26. 縦ベクトル
n×1 行列である。
np.array([[1], [2], [3], [4], [5]])
array([[1],
[2],
[3],
[4],
[5]])
np.zeros((5, 1))
array([[0.],
[0.],
[0.],
[0.],
[0.]])
np.empty(9)
array([0., 0., 0., 0., 0., 0., 0., 0., 0.])
1.27. 既存の行列と同じサイズの行列を作る
a = np.ones((3, 5))
np.zeros_like(a)
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
np.empty_like(a)
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
1.28. 次元数の変更
a = np.arange(15)
b = np.reshape(a, (3, 5))
print(a)
print(b)
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
resize はインプレース
a = np.arange(15)
a.resize((3, 5))
print(a)
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
a.resize((15,))
print(a)
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
1.29. 行列をベクトルに変換,スカラーも配列に変換
x = np.array([[1,2,3,4],[6,7,8,9]])
np.ravel(x)
array([1, 2, 3, 4, 6, 7, 8, 9])
np.ravel(123)
array([123])
1.30. n 番目に大きい要素がどこにあるか
x = np.array([2, 1, 2, 3, 4, 5, 4, 3, 6, 4])
x.argsort()
array([1, 0, 2, 3, 7, 4, 6, 9, 5, 8])
(-x).argsort()
array([8, 5, 4, 6, 9, 3, 7, 0, 2, 1])
#### 1.30.1. argsort を使ってソートする
order = x.argsort()
x[order]
array([1, 2, 2, 3, 3, 4, 4, 4, 5, 6])
rev = (-x).argsort()
x[rev]
array([6, 5, 4, 4, 4, 3, 3, 2, 2, 1])
2. 配列の演算
2.1. ベクトルと定数
a = np.array(range(10))
a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
a + 2
array([ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
a - 4
array([-4, -3, -2, -1, 0, 1, 2, 3, 4, 5])
a*3
array([ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27])
a/5
array([0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2, 1.4, 1.6, 1.8])
a**0.5
array([0. , 1. , 1.41421356, 1.73205081, 2. ,
2.23606798, 2.44948974, 2.64575131, 2.82842712, 3. ])
2.2. 配列と定数
a = np.array([[1, 2, 3], [4, 5, 6]])
a
array([[1, 2, 3],
[4, 5, 6]])
a + 1
array([[2, 3, 4],
[5, 6, 7]])
a - 2
array([[-1, 0, 1],
[ 2, 3, 4]])
a*3
array([[ 3, 6, 9],
[12, 15, 18]])
a/4
array([[0.25, 0.5 , 0.75],
[1. , 1.25, 1.5 ]])
a**0.5
array([[1. , 1.41421356, 1.73205081],
[2. , 2.23606798, 2.44948974]])
2.3. ベクトルとベクトル
a = np.array(range(5))
b = [2, 4, 1, 8, 3]
print(a)
print(b)
[0 1 2 3 4]
[2, 4, 1, 8, 3]
a + b
array([ 2, 5, 3, 11, 7])
a - b
array([-2, -3, 1, -5, 1])
a*b
array([ 0, 4, 2, 24, 12])
a/b
array([0. , 0.25 , 2. , 0.375 , 1.33333333])
a**b
array([ 0, 1, 2, 6561, 64])
2.4. 内積
a = np.array(range(5))
b = [2, 4, 1, 8, 3]
np.dot(a, b)
42
sum(a*b)
42
2.5. 外積
2.5.1. デフォルトでは演算子は "*"
np.outer(a, b)
array([[ 0, 0, 0, 0, 0],
[ 2, 4, 1, 8, 3],
[ 4, 8, 2, 16, 6],
[ 6, 12, 3, 24, 9],
[ 8, 16, 4, 32, 12]])
np.outer([2, 3], [3, 5, 7])
array([[ 6, 10, 14],
[ 9, 15, 21]])
2.5.2. 掛け算以外
np.add.outer(a, b)
array([[ 2, 4, 1, 8, 3],
[ 3, 5, 2, 9, 4],
[ 4, 6, 3, 10, 5],
[ 5, 7, 4, 11, 6],
[ 6, 8, 5, 12, 7]])
np.subtract.outer(a, b)
array([[-2, -4, -1, -8, -3],
[-1, -3, 0, -7, -2],
[ 0, -2, 1, -6, -1],
[ 1, -1, 2, -5, 0],
[ 2, 0, 3, -4, 1]])
np.multiply.outer(a, b)
array([[ 0, 0, 0, 0, 0],
[ 2, 4, 1, 8, 3],
[ 4, 8, 2, 16, 6],
[ 6, 12, 3, 24, 9],
[ 8, 16, 4, 32, 12]])
np.divide.outer(a, b)
array([[0. , 0. , 0. , 0. , 0. ],
[0.5 , 0.25 , 1. , 0.125 , 0.33333333],
[1. , 0.5 , 2. , 0.25 , 0.66666667],
[1.5 , 0.75 , 3. , 0.375 , 1. ],
[2. , 1. , 4. , 0.5 , 1.33333333]])
np.maximum.outer(a, b)
array([[2, 4, 1, 8, 3],
[2, 4, 1, 8, 3],
[2, 4, 2, 8, 3],
[3, 4, 3, 8, 3],
[4, 4, 4, 8, 4]])
np.minimum.outer(a, b)
array([[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[2, 2, 1, 2, 2],
[2, 3, 1, 3, 3],
[2, 4, 1, 4, 3]])
2.6. ベクトルと行列
a = np.array([1,2,3])
b = np.array([[11, 12, 13], [14, 15, 16]])
a + b
array([[12, 14, 16],
[15, 17, 19]])
a - b
array([[-10, -10, -10],
[-13, -13, -13]])
a*b
array([[11, 24, 39],
[14, 30, 48]])
a/b
array([[0.09090909, 0.16666667, 0.23076923],
[0.07142857, 0.13333333, 0.1875 ]])
a**b
array([[ 1, 4096, 1594323],
[ 1, 32768, 43046721]])
2.7. 行列と行列
a = np.array([[1,2,3], [4, 5, 6]])
b = np.array([[11, 12, 13], [14, 15, 16]])
a + b
array([[12, 14, 16],
[18, 20, 22]])
a - b
array([[-10, -10, -10],
[-10, -10, -10]])
a*b
array([[11, 24, 39],
[56, 75, 96]])
a/b
array([[0.09090909, 0.16666667, 0.23076923],
[0.28571429, 0.33333333, 0.375 ]])
a**b
array([[ 1, 4096, 1594323],
[ 268435456, 30517578125, 2821109907456]])
2.8. 行列積
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = np.array([[3, 1, 4], [2, 3, 5], [3, 2, 4]])
a.dot(b)
array([[ 16, 13, 26],
[ 40, 31, 65],
[ 64, 49, 104]])
np.dot(a, b)
array([[ 16, 13, 26],
[ 40, 31, 65],
[ 64, 49, 104]])
a @ b
array([[ 16, 13, 26],
[ 40, 31, 65],
[ 64, 49, 104]])
2.9. 転置
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
np.transpose(a)
array([[1, 4, 7],
[2, 5, 8],
[3, 6, 9]])
a.T
array([[1, 4, 7],
[2, 5, 8],
[3, 6, 9]])
2.10. 逆行列
from scipy import linalg
b = np.array([[3, 1, 4], [2, 3, 5], [3, 2, 4]])
linalg.inv(b)
array([[-0.28571429, -0.57142857, 1. ],
[-1. , 0. , 1. ],
[ 0.71428571, 0.42857143, -1. ]])
(linalg.inv(b)).dot(b) # 逆行列ともとの行列の行列積は単位行列になる
array([[ 1.00000000e+00, -2.22044605e-16, -4.44089210e-16],
[ 0.00000000e+00, 1.00000000e+00, 0.00000000e+00],
[ 0.00000000e+00, 0.00000000e+00, 1.00000000e+00]])
2.11. 連立方程式
b = np.array([[3, 1, 4], [2, 3, 5], [3, 2, 4]])
c = np.array([3,2,4])
linalg.solve(b, c)
array([ 2., 1., -1.])
2.12. 行列式
linalg.det(b)
-7.0
2.13. ノルム
linalg.norm(b)
9.643650760992955
2.14. 固有値,固有ベクトル
val, vec = linalg.eig(b)
val
array([ 8.90045165+0.j, 1.59319575+0.j, -0.4936474 +0.j])
vec
array([[-0.49779335, -0.54449017, -0.54183429],
[-0.65269915, 0.83857094, -0.5716379 ],
[-0.57112661, -0.01814497, 0.61615397]])
2.15. 特異値分解
U, s, V = linalg.svd(b)
U
array([[-0.52488074, 0.64926919, -0.55040869],
[-0.63715332, -0.72847437, -0.25171561],
[-0.56438981, 0.21857405, 0.79604618]])
s
array([9.49923625, 1.59740488, 0.46131157])
V
array([[-0.47815616, -0.375306 , -0.79404792],
[ 0.71777732, -0.68799452, -0.10704792],
[ 0.5061249 , 0.62113521, -0.59835495]])