#author("2019-11-20T04:18:46+00:00","","") [[Python覚え書き]] > * numpy入門 [#w8d4980d] #setlinebreak(on); #html(<script async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML"></script>) #contents -- 関連 --- [[Python]] --- [[Python覚え書き]] --- [[ディープラーニング入門]] --- [[TensorFlow入門]] --- [[Keras入門]] --- [[Chainer入門]] --- [[PyTorch入門]] --- [[pandas入門]] --- [[R言語入門]] --- [[機械学習の為の数学の基礎]] --- [[統計学の基礎知識]] ** 行列の作成 [#fb894e40] #html(<div style="padding-left:10px;">) *** 0〜の連番を値に持つ配列の作成 [#jc9af6de] #html(<div style="padding-left:10px;">) #mycode2(python){{ import numpy as np x = np.arange(10) print(x) }} 結果 #myterm2(){{ [0 1 2 3 4 5 6 7 8 9] }} #html(</div>) *** リストからベクトル(1次元配列)を作成する [#r8170824] #html(<div style="padding-left:10px;">) #mycode2(python){{ import numpy as np x = np.array([1, 2, 3]) print(x) }} 結果 #myterm2(){{ [1 2 3] }} #html(</div>) *** 要素が0の行列の作成 [#hf5024a4] #html(<div style="padding-left:10px;">) #mycode2(python){{ import numpy as np x = np.zeros(10) print(x) }} 結果 #myterm2(){{ [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] }} #html(</div>) *** ランダム値の行列の作成 [#h5cf0195] #html(<div style="padding-left:10px;">) #mycode2(python){{ import numpy as np # サイズ=10の乱数配列を作成(値は 0〜1 の間の実数) x1 = np.random.rand(10) print(x1) # 2〜5の範囲の乱数を 10*10 配列で作成 x2 = np.random.randint(2, 5, (10, 10)) print(x2) }} 結果 #myterm2(){{ [0.16561915 0.09556958 0.46954353 0.90722789 0.27012909 0.69858166 0.31817772 0.27222095 0.36353651 0.84831603] [[2 3 3 4 2 4 4 4 4 3] [4 4 4 3 3 4 2 4 3 3] [2 2 4 3 2 4 2 2 4 3] [2 4 3 3 4 3 4 3 2 2] [2 4 2 3 3 4 4 4 3 3] [4 4 3 4 2 2 3 2 4 4] [3 3 4 4 3 4 4 2 4 4] [4 3 3 2 4 3 3 3 4 3] [3 3 3 2 2 2 3 4 3 4] [3 3 2 4 2 4 3 4 4 3]] }} 他にも 正規分布、ベータ分布などいろいろある。 https://docs.scipy.org/doc/numpy/reference/routines.random.html #html(</div>) #html(</div>) ** 要素の参照 [#ia2554ad] #html(<div style="padding-left:10px;">) #mycode2(python){{ import numpy as np x = np.array([[1,2,3],[4,5,6]]) print(x[1,1]) }} 結果 #myterm2(){{ 5 }} #html(</div>) ** 行列のスライシング [#o10f4553] #html(<div style="padding-left:10px;">) #mycode2(python){{ 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おきに }} 結果 #myterm2(){{ [1 2 3 4 5] [2 3] [1 3 5] }} #html(</div>) ** 要素の書き換え [#qa076abb] #html(<div style="padding-left:10px;">) #mycode2(python){{ import numpy as np x = np.array([[1,2,3],[4,5,6]]) print(x) x[1,1] = 10 print(x) }} 結果 #myterm2(){{ [[1 2 3] [4 5 6]] [[ 1 2 3] [ 4 10 6]] }} #html(</div>) ** 行列のサイズ変更 [#r96695d9] #html(<div style="padding-left:10px;">) numpy.reshape で行列のサイズ変更を行う事ができる。 ※ https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html #mycode2(python){{ 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) }} 結果 #myterm2(){{ [ 1 2 3 4 5 6 7 8 9 10] [[ 1 2 3 4 5] [ 6 7 8 9 10]] }} #html(</div>) ** 行列の追加 [#h320c2aa] #html(<div style="padding-left:10px;">) numpy.append で行列の末尾に要素を追加する事ができる ※ https://docs.scipy.org/doc/numpy/reference/generated/numpy.append.html #mycode2(python){{ 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) }} 結果 #myterm2(){{ [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 を使用すると指定した位置に要素を挿入する事ができる。 ※ https://docs.scipy.org/doc/numpy/reference/generated/numpy.insert.html #mycode2(python){{ 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) }} 結果 #myterm2(){{ [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]] }} #html(</div>) ** 行列の結合 [#a6d1cda9] #html(<div style="padding-left:10px;">) *** hstack [#rfdce9bc] #html(<div style="padding-left:10px;">) ベクトル(1次元配列)の結合 #mycode2(python){{ 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) }} 結果 #myterm2(){{ [1 2 3] [4 5 6] [1 2 3 4 5 6] }} 行列(2次元配列)の結合 #mycode2(python){{ 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) }} 結果 #myterm2(){{ [[1 2 3] [4 5 6]] [[1 1 1] [2 2 2]] [[1 2 3 1 1 1] [4 5 6 2 2 2]] }} #html(</div>) *** vstack [#ibf332b1] #html(<div style="padding-left:10px;">) ベクトル(1次元配列)の結合 #mycode2(python){{ 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) }} 結果 #myterm2(){{ [1 2 3] [4 5 6] [[1 2 3] [4 5 6]] }} 行列(2次元配列)の結合 #mycode2(python){{ 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) }} 結果 #myterm2(){{ [[1 2 3] [4 5 6]] [[1 1 1] [2 2 2]] [[1 2 3] [4 5 6] [1 1 1] [2 2 2]] }} #html(</div>) #html(</div>) ** 行列のファイルへの保存と読み出し [#h4ac3fce] #html(<div style="padding-left:10px;">) #mycode2(python){{ 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) }} 結果 #myterm2(){{ [[1 2 3] [4 5 6]] [[1 2 3] [4 5 6]] }} #html(</div>) ** 行列の演算 [#f3649594] #html(<div style="padding-left:10px;">) *** 行列同士の演算 [#da34d421] #html(<div style="padding-left:10px;">) #mycode2(python){{ 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) }} 結果 #myterm2(){{ [1 2 3] [4 5 6] 加算 [5 7 9] 乗算 [ 4 10 18] }} #html(</div>) *** 行列とスカラーの演算 [#k13aa43c] #html(<div style="padding-left:10px;">) #mycode2(python){{ import numpy as np a = np.array([1,2,3]) print(a) print('加算(+5)') print(a + 5) print('乗算(*5)') print(a * 5) }} 結果 #myterm2(){{ [1 2 3] 加算(+5) [6 7 8] 乗算(*5) [ 5 10 15] }} #html(</div>) *** 行列積の計算 [#vd9870ad] #html(<div style="padding-left:10px;">) 行列積は ndarray.dot を使用して計算する #mycode2(python){{ 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)) }} 結果 #myterm2(){{ [[22 28] [49 64]] }} 一応、数学の復習を兼ねて確認 #html(<div>) #html(<table style="display:inline-block;vertical-align:middle;"><tr><td rowspan="2" style="font-size:1.5rem;vertical-align: middle;">(</td><td>1</td><td>2</td><td>3</td><td rowspan="2" style="font-size:1.5rem;vertical-align: middle;">)</td></tr><tr><td>4</td><td>5</td><td>6</td></tr></table>) #html(<div style="padding:10px;display: inline-block">*</div>) #html(<table style="display:inline-block;vertical-align:middle;"><tr><td rowspan="3" style="font-size:2rem;vertical-align: middle;">(</td><td>1</td><td>2</td><td rowspan="3" style="font-size:2rem;vertical-align: middle;">)</td></tr><tr><td>3</td><td>4</td></tr><tr><td>5</td><td>6</td></tr></table>) #html(<span> = </span>) #html(<table style="display:inline-block;vertical-align:middle;"><tr><td rowspan="2" style="font-size:1.5rem;vertical-align: middle;">(</td><td>1*1 + 2*3 + 3*5</td><td style="padding-left: 20px;">1*2 + 2*4 + 3*6</td><td rowspan="2" style="font-size:1.5rem;vertical-align: middle;">)</td></tr><tr><td>4*1 + 5*3 + 6*5</td><td style="padding-left: 20px;">4*2 + 5*4 + 6*6</td></tr></table>) #html(<span> = </span>) #html(<table style="display:inline-block;vertical-align:middle;"><tr><td rowspan="2" style="font-size:1.5rem;vertical-align: middle;">(</td><td>22</td><td style="padding-left: 20px;">28</td><td rowspan="2" style="font-size:1.5rem;vertical-align: middle;">)</td></tr><tr><td>49</td><td style="padding-left: 20px;">64</td></tr></table>) 合ってそう。 #html(</div>) #html(</div>) #html(</div>) ** 乱数生成 [#ia659e0c] #html(<div style="padding-left: 10px;">) *** np.random による乱数の生成 [#n81001da] 150 から 180cm のランダムな身長データを整数で生成。 #mycode2(python){{ height = np.random.randint(150, 180, 50) }} 150 から 180cm のランダムな身長データを小数点以下2桁で生成。 #mycode2(python){{ height = np.round(np.random.uniform(150, 180, 50), 2) }} #html(</div>) #html(</div>) ** 統計関数など [#o1420a5e] #html(<div style="padding-left: 10px;">) *** 合計 [#u0c8b9b0] #html(<div style="padding-left: 10px;">) 合計値は sum で求める。 #mycode2(python){{ import numpy as np x = np.array([1, 2, 3, 4, 5]) np.sum(x) # 15 }} #html(</div>) *** 平均値 [#j87931cb] #html(<div style="padding-left: 10px;">) 平均値 はmeanで求める。 #mycode2(python){{ import numpy as np x = np.array([1, 2, 3, 4, 5]) np.mean(x) # 3.0 }} #html(</div>) //*** 加重平均 [#g52e339c] //#html(<div style="padding-left: 10px;">) //#TODO // average //#html(</div>) *** 中央値 [#efde7689] #html(<div style="padding-left: 10px;">) 中央値は medianで求める。 #mycode2(python){{ import numpy as np x = np.array([1, 2, 3, 4, 5]) np.median(x) # 3.0 }} #html(</div>) *** 最頻値 [#u1e50123] #html(<div style="padding-left: 10px;">) #mycode2(python){{ import numpy as np x = np.array([1, 2, 3, 4, 5, 1, 3, 5, 4, 5, 6]) np.argmax(np.bincount(x)) # 5 }} もしくは #mycode2(python){{ from statistics import mode x = np.array([1, 2, 3, 4, 5, 1, 3, 5, 4, 5, 6]) mode(x) # 5 }} #html(</div>) *** 分散 [#uf97af68] #html(<div style="padding-left: 10px;">) 分散はvarで求める。 #mycode2(python){{ 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 }} #html(</div>) *** 標準偏差 [#e513ad04] #html(<div style="padding-left: 10px;">) 標準偏差はstdで求める。 #mycode2(python){{ 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 }} #html(</div>) *** 四分位点、四分位範囲 [#k400a332] #html(<div style="padding-left: 10px;">) #mycode2(python){{ 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 ) }} #html(</div>) *** 単位行列 [#w3be82ce] #html(<div style="padding-left: 10px;">) #mycode2(python){{ import numpy as np np.eye(3) }} 結果 #myterm2(){{ array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]) }} #html(</div>) *** 逆行列 [#zf211bd2] #html(<div style="padding-left: 10px;">) AB=I, BA=I を満たす行列B(Aの逆行列)を求める。 #mycode2(python){{ 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)) }} 結果 #myterm2(){{ a: [[2 3] [4 5]] b: [[-2.5 1.5] [ 2. -1. ]] ba: [[1. 0.] [0. 1.]] ab: [[1. 0.] [0. 1.]] }} #html(</div>) *** 転置行列 [#f224c718] #html(<div style="padding-left: 10px;">) #mycode2(python){{ x = np.array([[1,2,3],[4,5,6]]) print(x.T) }} 結果 #myterm2(){{ [[1 4] [2 5] [3 6]] }} #html(</div>) *** 内積、行列積の計算 [#abf69d76] #html(<div style="padding-left: 10px;">) 行列積は np.dot で求める事ができる。 #mycode2(python){{ 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) }} 結果 #myterm2(){{ array([[ 9, 12, 15], [19, 26, 33], [29, 40, 51]]) }} #html(</div>) *** 行列積を利用して仮説の計算を行う [#m68c16f3] #html(<div style="padding-left: 10px;">) h(x) = n + m*y という仮説は行列積を利用して計算する事ができる。 以下の3つの仮説がある場合。 #html(){{ <div style="padding-left: 10px;"> <math> <mrow> <msub><mo>h</mo><mo>θ</mo></msub><mo>(x)</mo> <mo>=</mo> <mi>2</mi> <mo>-</mo> <mi>3y</mi> </mrow> </math> <br/> <math> <mrow> <msub><mo>h</mo><mo>θ</mo></msub><mo>(x)</mo> <mo>=</mo> <mi>3</mi> <mo>-</mo> <mi>4y</mi> </mrow> </math> <br/> <math> <mrow> <msub><mo>h</mo><mo>θ</mo></msub><mo>(x)</mo> <mo>=</mo> <mi>5</mi> <mo>-</mo> <mi>10y</mi> </mrow> </math> </div> }} y = [10, 20, 30] というベクトルに対して上記の各仮説の計算を行うには、以下の通り行列積を計算する。 #html(){{ <div style="padding: 10px;"> <math> <mfenced> <mtable> <mtr> <mtd> <mn>1</mn> </mtd> <mtd> <mn>10</mn> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> <mtd> <mn>20</mn> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> <mtd> <mn>30</mn> </mtd> </mtr> </mtable> </mfenced> </math> * <math> <mfenced> <mtable> <mtr> <mtd> <mn>2</mn> </mtd> <mtd> <mn>3</mn> </mtd> <mtd> <mn>5</mn> </mtd> </mtr> <mtr> <mtd> <mn>3</mn> </mtd> <mtd> <mn>4</mn> </mtd> <mtd> <mn>10</mn> </mtd> </mtr> </mtable> </mfenced> <mo> = </mo> <mfenced> <mtable> <mtr> <mtd> <mn>(1 * 2 + 10 * 3)</mn> </mtd> <mtd> <mn>(1 * 3 + 10 * 4)</mn> </mtd> <mtd> <mn>(1 * 5 + 10 * 10)</mn> </mtd> </mtr> <mtr> <mtd> <mn>(1 * 2 + 20 * 3)</mn> </mtd> <mtd> <mn>(1 * 3 + 20 * 4)</mn> </mtd> <mtd> <mn>(1 * 5 + 20 * 10)</mn> </mtd> </mtr> <mtr> <mtd> <mn>(1 * 2 + 30 * 3)</mn> </mtd> <mtd> <mn>(1 * 3 + 30 * 4)</mn> </mtd> <mtd> <mn>(1 * 5 + 30 * 10)</mn> </mtd> </mtr> </mtable> </mfenced> <mo> = </mo> <mfenced> <mtable> <mtr> <mtd> <mn>32</mn> </mtd> <mtd> <mn>43</mn> </mtd> <mtd> <mn>105</mn> </mtd> </mtr> <mtr> <mtd> <mn>62</mn> </mtd> <mtd> <mn>83</mn> </mtd> <mtd> <mn>205</mn> </mtd> </mtr> <mtr> <mtd> <mn>92</mn> </mtd> <mtd> <mn>123</mn> </mtd> <mtd> <mn>305</mn> </mtd> </mtr> </mtable> </mfenced> </math> </div> }} 実装例 #mycode2(python){{ 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) }} 結果 #myterm2(){{ array([[ 32, 43, 105], [ 62, 83, 205], [ 92, 123, 305]]) }} #html(</div>) #html(</div>)