目次 †
行列の作成 †0〜の連番を値に持つ配列の作成 †import numpy as np x = np.arange(10) print(x) 結果 [0 1 2 3 4 5 6 7 8 9] 指定した範囲の値を指定個数に分割する †np.linspace(0, 10, 5) # ... array([ 0. , 2.5, 5. , 7.5, 10. ]) np.linspace(0, 100, 5) # ... array([ 0., 25., 50., 75., 100.]) np.linspace(0, 100, 11) # ... array([ 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.]) リストからベクトル(1次元配列)を作成する †import numpy as np x = np.array([1, 2, 3]) print(x) 結果 [1 2 3] 要素が0の行列の作成 †import numpy as np x = np.zeros(10) print(x) 結果 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 乱数の生成 †サイズ=10の乱数配列を作成 †np.random.seed() np.random.rand(10) # 値は 0〜1 の間の実数 結果 array([0.66665716, 0.53671533, 0.66012721, 0.9495542 , 0.78441076, 0.26098457, 0.06754334, 0.46535488, 0.48764828, 0.68502518]) 指定範囲の値を指定個数分生成する †np.random.seed() np.random.uniform(-10, 10, 10) np.random.uniform(-10, 10, (2, 5)) 結果 array([ 6.63545572, 4.95265166, 5.72494723, 6.38053746, 5.04741888, 6.10112906, -6.74466612, 5.11187673, -4.07671305, 3.30998199]) array([[-6.6427769 , -1.42335212, 2.81080724, 0.39621999, 3.01289381], [ 6.49264639, 3.05848916, -7.60294646, 0.42769374, 9.08846494]]) 指定範囲の値を指定個数分生成する(整数) †np.random.seed() np.random.randint(2, 5, 10) np.random.randint(2, 5, (5, 2)) print(x2) 結果 array([2, 2, 2, 4, 2, 3, 4, 2, 4, 2]) array([[4, 3], [3, 2], [2, 3], [2, 3], [3, 4]]) サンプル †150 から 180cm のランダムな身長データを整数で生成 height = np.random.randint(150, 180, 50) 150 から 180cm のランダムな身長データを小数点以下2桁で生成。 height = np.round(np.random.uniform(150, 180, 50), 2) 他にも 正規分布、ベータ分布などいろいろある。 要素の参照 †import numpy as np x = np.array([[1,2,3],[4,5,6]]) print(x[1,1]) 結果 5 行列のスライシング †import numpy as np x = np.array([1,2,3,4,5,6,7,8,9,10]) print(x[:5]) print(x[1:3]) print(x[0:5:2]) # 0〜4まで2おきに 結果 [1 2 3 4 5] [2 3] [1 3 5] 要素の書き換え †import numpy as np x = np.array([[1,2,3],[4,5,6]]) print(x) x[1,1] = 10 print(x) 結果 [[1 2 3] [4 5 6]] [[ 1 2 3] [ 4 10 6]] 行列のサイズ変更 †numpy.reshape で行列のサイズ変更を行う事ができる。 import numpy as np x = np.array([1,2,3,4,5,6,7,8,9,10]) print(x) # 1次元配列を2*5の行列に変更 y = x.reshape(2,5) print(y) 結果 [ 1 2 3 4 5 6 7 8 9 10] [[ 1 2 3 4 5] [ 6 7 8 9 10]] 行列の追加 †numpy.append で行列の末尾に要素を追加する事ができる import numpy as np x1 = np.array([1,2,3]) x2 = np.append(x1, [4,5,6]) print(x1) print(x2) y1 = np.array([[1,2,3],[4,5,6]]) y2 = np.append(y1, [[1,1,1],[2,2,2]]) y3 = np.append(y1, [[1,1,1],[2,2,2]], axis=0) y4 = np.append(y1, [[1,1,1],[2,2,2]], axis=1) print(y1) print(y2) print(y3) print(y4) 結果 [1 2 3] [1 2 3 4 5 6] [[1 2 3] [4 5 6]] [1 2 3 4 5 6 1 1 1 2 2 2] [[1 2 3] [4 5 6] [1 1 1] [2 2 2]] [[1 2 3 1 1 1] [4 5 6 2 2 2]] numpy.insert を使用すると指定した位置に要素を挿入する事ができる。 import numpy as np x1 = np.array([1,2,3]) x2 = np.insert(x1, 1, [4,5,6]) print(x1) print(x2) y1 = np.array([[1,2,3],[4,5,6]]) y2 = np.insert(y1, 1, [9,9,9]) y3 = np.insert(y1, 1, [9,9,9], axis=0) y4 = np.insert(y1, 1, [9,9], axis=1) print(y1) print(y2) print(y3) print(y4) 結果 [1 2 3] [1 4 5 6 2 3] [[1 2 3] [4 5 6]] [1 9 9 9 2 3 4 5 6] [[1 2 3] [9 9 9] [4 5 6]] [[1 9 2 3] [4 9 5 6]] 行列の結合 †hstack †ベクトル(1次元配列)の結合 import numpy as np x1 = np.array([1,2,3]) x2 = np.array([4,5,6]) x3 = np.hstack((x1, x2)) print(x1) print(x2) print(x3) 結果 [1 2 3] [4 5 6] [1 2 3 4 5 6] 行列(2次元配列)の結合 import numpy as np x1 = np.array([[1,2,3],[4,5,6]]) x2 = np.array([[1,1,1],[2,2,2]]) x3 = np.hstack((x1, x2)) print(x1) print(x2) print(x3) 結果 [[1 2 3] [4 5 6]] [[1 1 1] [2 2 2]] [[1 2 3 1 1 1] [4 5 6 2 2 2]] vstack †ベクトル(1次元配列)の結合 import numpy as np x1 = np.array([1,2,3]) x2 = np.array([4,5,6]) x3 = np.vstack((x1, x2)) print(x1) print(x2) print(x3) 結果 [1 2 3] [4 5 6] [[1 2 3] [4 5 6]] 行列(2次元配列)の結合 import numpy as np x1 = np.array([[1,2,3],[4,5,6]]) x2 = np.array([[1,1,1],[2,2,2]]) x3 = np.vstack((x1, x2)) print(x1) print(x2) print(x3) 結果 [[1 2 3] [4 5 6]] [[1 1 1] [2 2 2]] [[1 2 3] [4 5 6] [1 1 1] [2 2 2]] 行列のファイルへの保存と読み出し †import numpy as np i = np.array([[1,2,3],[4,5,6]]) # 保存 np.save('data1.npy', i) # 読み出し o = np.load('data1.npy') # CSVの読み出し csvdata = np.loadtxt("sample.csv", delimiter=",", skiprows=1) print(i) print(o) 結果 [[1 2 3] [4 5 6]] [[1 2 3] [4 5 6]] 行列の演算 †行列同士の演算 †import numpy as np a = np.array([1,2,3]) b = np.array([4,5,6]) print(a) print(b) print('加算') print(a + b) print('乗算') print(a * b) 結果 [1 2 3] [4 5 6] 加算 [5 7 9] 乗算 [ 4 10 18] 行列とスカラーの演算 †import numpy as np a = np.array([1,2,3]) print(a) print('加算(+5)') print(a + 5) print('乗算(*5)') print(a * 5) 結果 [1 2 3] 加算(+5) [6 7 8] 乗算(*5) [ 5 10 15] 行列積の計算 †行列積は ndarray.dot を使用して計算する import numpy as np x1 = np.array([[1,2,3],[4,5,6]]) x2 = np.array([[1,2],[3,4],[5,6]]) print(x1.dot(x2)) 結果 [[22 28] [49 64]] 一応、数学の復習を兼ねて確認
*
合ってそう。 統計関数など †合計 †合計値は sum で求める。 import numpy as np x = np.array([1, 2, 3, 4, 5]) np.sum(x) # 15 平均値 †平均値 はmeanで求める。 import numpy as np x = np.array([1, 2, 3, 4, 5]) np.mean(x) # 3.0 中央値 †中央値は medianで求める。 import numpy as np x = np.array([1, 2, 3, 4, 5]) np.median(x) # 3.0 最頻値 †import numpy as np x = np.array([1, 2, 3, 4, 5, 1, 3, 5, 4, 5, 6]) np.argmax(np.bincount(x)) # 5 もしくは from statistics import mode x = np.array([1, 2, 3, 4, 5, 1, 3, 5, 4, 5, 6]) mode(x) # 5 分散 †分散はvarで求める。 import numpy as np x = np.array([1, 2, 3, 4, 5]) np.var(x) # 2.0 # 確認 np.sum((x - x.mean()) * 2) / np.size(x) # 2.0 標準偏差 †標準偏差はstdで求める。 import numpy as np x = np.array([1, 2, 3, 4, 5]) np.std(x) # 1.41421356237 # 確認 np.sqrt(np.sum((x - x.mean()) * 2) / np.size(x)) # 1.4142135623730951 四分位点、四分位範囲 †import numpy as np data = np.array([2,69,67,75,84,92,80,77,65,78,84,95,71]) # 四分位点を求める q25, q75 = np.percentile(data, [25 ,75]) # 四分位範囲 iqr = q75 - q25 print(q25, q75, iqr ) 単位行列 †import numpy as np np.eye(3) 結果 array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]) 逆行列 †AB=I, BA=I を満たす行列B(Aの逆行列)を求める。 a = np.array([[2,3],[4,5]]) b = np.linalg.inv(a) print("a: ", a) print("b: ", b) print("ba: ", np.dot(b, a)) print("ab: ", np.dot(a, b)) 結果 a: [[2 3] [4 5]] b: [[-2.5 1.5] [ 2. -1. ]] ba: [[1. 0.] [0. 1.]] ab: [[1. 0.] [0. 1.]] 転置行列 †x = np.array([[1,2,3],[4,5,6]]) print(x.T) 結果 [[1 4] [2 5] [3 6]] 内積、行列積の計算 †行列積は np.dot で求める事ができる。 import numpy as np x = np.array([[1,2],[3,4],[5,6]]) y = np.array([[1,2,3],[4,5, 6]]) np.dot(x, y) 結果 array([[ 9, 12, 15], [19, 26, 33], [29, 40, 51]]) 行列積を利用して仮説の計算を行う †h(x) = n + m*y という仮説は行列積を利用して計算する事ができる。 以下の3つの仮説がある場合。 y = [10, 20, 30] というベクトルに対して上記の各仮説の計算を行うには、以下の通り行列積を計算する。
*
実装例 import numpy as np a = np.array([[1, 10],[1, 20],[1, 30]]) b = np.array([[2, 3, 5],[3, 4, 10]]) np.dot(a, b) 結果 array([[ 32, 43, 105], [ 62, 83, 205], [ 92, 123, 305]]) |