目次

行列の作成

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)

他にも 正規分布、ベータ分布などいろいろある。
https://docs.scipy.org/doc/numpy/reference/routines.random.html

要素の参照

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 で行列のサイズ変更を行う事ができる。
https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

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 で行列の末尾に要素を追加する事ができる
https://docs.scipy.org/doc/numpy/reference/generated/numpy.append.html

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 を使用すると指定した位置に要素を挿入する事ができる。
https://docs.scipy.org/doc/numpy/reference/generated/numpy.insert.html

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

一応、数学の復習を兼ねて確認

(123)
456
*
(12)
34
56
=
(1*1 + 2*3 + 3*51*2 + 2*4 + 3*6)
4*1 + 5*3 + 6*54*2 + 5*4 + 6*6
=
(2228)
4964

合ってそう。

統計関数など

合計

合計値は 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つの仮説がある場合。

hθ(x) = 2 - 3y
hθ(x) = 3 - 4y
hθ(x) = 5 - 10y

y = [10, 20, 30] というベクトルに対して上記の各仮説の計算を行うには、以下の通り行列積を計算する。

1 10 1 20 1 30 * 2 3 5 3 4 10 = (1 * 2 + 10 * 3) (1 * 3 + 10 * 4) (1 * 5 + 10 * 10) (1 * 2 + 20 * 3) (1 * 3 + 20 * 4) (1 * 5 + 20 * 10) (1 * 2 + 30 * 3) (1 * 3 + 30 * 4) (1 * 5 + 30 * 10) = 32 43 105 62 83 205 92 123 305

実装例

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

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-01-16 (水) 08:40:08 (1925d)