#author("2019-02-22T03:42:38+00:00","","")
#author("2019-02-27T09:24:32+00:00","","")
[[Python覚え書き]] >
* numpy入門 [#w8d4980d]
#setlinebreak(on);

#contents
-- 関連
--- [[Python]]
--- [[Python覚え書き]]
--- [[ディープラーニング入門]]
--- [[TensorFlow入門]]
--- [[Keras入門]]
--- [[Chainer入門]]
--- [[PyTorch入門]]
--- [[pandas入門]]
--- [[R言語入門]]
--- [[機械学習の為の数学の基礎]]

** 行列の作成 [#fb894e40]
#html(<div style="padding-left:10px;">)

*** 0&#12316;の連番を値に持つ配列の作成 [#jc9af6de]
#html(<div style="padding-left:10px;">)

#mycode2(){{
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(){{
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(){{
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(){{
import numpy as np

# サイズ=10の乱数配列を作成(値は 0&#12316;1 の間の実数)
x1 = np.random.rand(10)
print(x1)

# 2&#12316;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(){{
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(){{
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&#12316;4まで2おきに
}}

結果
#myterm2(){{
[1 2 3 4 5]
[2 3]
[1 3 5]
}}

#html(</div>)

** 要素の書き換え [#qa076abb]
#html(<div style="padding-left:10px;">)

#mycode2(){{
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(){{
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(){{
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(){{
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(){{
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(){{
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(){{
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(){{
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(){{
import numpy as np

i = np.array([[1,2,3],[4,5,6]])

# 保存
np.save('data1.npy', i)

# 読み出し
o = np.load('data1.npy')

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(){{
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(){{
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(){{
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;">)

*** random.randint による乱数の生成 [#n81001da]
150 から 180cm のランダムな身長データを生成する例。
#mycode2(){{
height = np.random.randint(150, 180, 50)
}}
#html(</div>)

#html(</div>)

** 統計関数 [#o1420a5e]
#html(<div style="padding-left: 10px;">)

*** 合計 [#u0c8b9b0]
#html(<div style="padding-left: 10px;">)
#TODO
#html(</div>)

*** 算術平均 [#lf77186e]
#html(<div style="padding-left: 10px;">)
#TODO
// mean
#html(</div>)

*** 加重平均 [#g52e339c]
#html(<div style="padding-left: 10px;">)
#TODO
// average
#html(</div>)

*** 中央値 [#efde7689]
#html(<div style="padding-left: 10px;">)
#TODO
// median
#html(</div>)

*** 標準偏差 [#e513ad04]
#html(<div style="padding-left: 10px;">)
#TODO
// std
#html(</div>)

#html(</div>)


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS