見出し画像

Pythonコードの復習(1) - 組み込み関数、Numpyの行列処理について

E資格の学習の一環として、Pythonそのものの組み込み関数の他Numpy, Pandas, Matplot, SKLearn等々のライブラリーの使い方を復習しています。今回は組み込み関数とNumpyの復習が終わったのでその使用例を掲載しておきます。

Pythonの組み込み関数

zip

for文を使って複数のイテラブル(list)から同時に要素を取り出す

#zip - for文を使って複数のイテラブル(list)から同時に要素を取り出す

list1 = ["a","b","c","d"]
list2 = ["x","y","z","w"]
new_list = []

for x, y in zip( list1, list2):
new_list.append(x)
new_list.append(y)

print(f"{x}, {y}")
print(new_list)
#実行結果
a, x
b, y
c, z
d, w
['a', 'x', 'b', 'y', 'c', 'z', 'd', 'w']

enumerate

for文を使って1つのイテラブル(list)からインデックスと要素を取り出す

list = ["a","b","c","d"]
index_list = []
new_list = []

for i, x in enumerate(list1):
index_list.append(i)
new_list.append(x)
print(f"{i}, {x}")

print(index_list)
print(new_list)
#実行結果
0, a
1, b
2, c
3, d
[0, 1, 2, 3]
['a', 'b', 'c', 'd']

アダマール積、二乗、べき乗の計算

計算式を用いるか、np.multiply, np.square, np.powerを用いる

#行列のアダマール積、二乗、べき乗を求める関数
#行列のアダマール積
a = np.array([[1,3],[5,7]])
b = np.array([[1,2],[3,4]])

print( a*b )
print( np.multiply(a,b) )

#行列の2乗
a = np.array([[1,3],[5,7]])
print( a**2)
print( np.square(a) )

#行列のべき乗
a = np.array([[1,3],[5,7]])
print( a**3)
print( np.power(a,3))
#実行結果
[[ 1  6]
 [15 28]]
[[ 1  6]
 [15 28]]
[[ 1  9]
 [25 49]]
[[ 1  9]
 [25 49]]
[[  1  27]
 [125 343]]
[[  1  27]
 [125 343]]

行列・ベクトルの行列積・内積の計算

計算式を用いるか、np.dotを用いる

x = np.array([[1,3,5], [7,9,11]])
y = np.array([[1,2], [3,4],[5,6]])

print(np.dot(x,y))
print(x.dot(y))
print(x@y)

u = np.array([1,3,5])
v = np.array([7,9,11])

print(np.dot(u,v))
print(u.dot(v))
print(u@v)
#実行結果
[[ 35  44]
 [ 89 116]]
[[ 35  44]
 [ 89 116]]
[[ 35  44]
 [ 89 116]]
89
89
89

次元数を求める

array.ndimを使う

#行列の次元数を求める関数
x1 = np.array([1,2,3])
x2 = np.array([[1,2,3],[4,5,6]])

print(x1.ndim)
print(x2.ndim)

#行列を転置行列にする
print(x1.T)
print(x2.T)
#実行結果
1
2
[1 2 3]
[[1 4]
 [2 5]
 [3 6]]

ブロードキャスト

arrayと異なる型の数値の演算をする。異なるデータセットの行列を作りたい時に便利な機能

#ブロードキャスト - arrayと異なる型の数値の演算
x = np.array([1,3,5])
y = 2
print(x + y)

#2次元行列とスカラーの和、2次元行列と1次元行列の和をブロードキャストで計算する
x = np.array([[1,3,5], [2,4,6]])
y = 2
print(x + y)

x = np.array([[1,3,5], [2,4,6]])
y = np.array([10,20,30])
print(x + y)
#実行結果
[3 5 7]
[[3 5 7]
 [4 6 8]]
[[11 23 35]
 [12 24 36]]

スライス

インデックスを指定して行列・ベクトルからデータを抽出する。データセットを作成する際にかなりの頻度で活用する

#スライス - インデックスを指定して行列・ベクトルからデータを抽出する
a = np.array([1,3,5,7,9,11,13])

#インデックスが2以降・5以下のデータを抽出
print(a[2:5])

#インデックスが5以下のデータを抽出
print(a[:5])

#インデックスが2以降のデータを抽出
print(a[2:])

#インデックスが2以降・5以下のデータを2の刻み幅で抽出
print(a[2:5:2])

#逆順のインデックスで抽出
print(a[::-1])

#???
print(a[-3:0:-1])
#実行結果
[5 7 9]
[1 3 5 7 9]
[ 5  7  9 11 13]
[5 9]
[13 11  9  7  5  3  1]
[9 7 5 3]
#2次元行列のスライスのやり方

a = np.array([[1,3,5,7,9,11,13],
[1,3,5,7,9,11,13],
[1,3,5,7,9,11,13],
[1,3,5,7,9,11,13],
[1,3,5,7,9,11,13]])
b = np.array([[0],[1],[2],[3],[4]])

array = a + b
print(array)

#行列の2行以降、4行目までを抽出
print(array[2:4, : ])

#行列の2列以降、4列目までを抽出
print(array[:, 2:4 ])

#行列の2行・列以降、4行・列目のみを抽出
print(array[2:4, 2:4 ])
#実行結果
[[ 1  3  5  7  9 11 13]
 [ 2  4  6  8 10 12 14]
 [ 3  5  7  9 11 13 15]
 [ 4  6  8 10 12 14 16]
 [ 5  7  9 11 13 15 17]]

[[ 3  5  7  9 11 13 15]
 [ 4  6  8 10 12 14 16]]

[[ 5  7]
 [ 6  8]
 [ 7  9]
 [ 8 10]
 [ 9 11]]

[[ 7  9]
 [ 8 10]]

最大値・最小値の抽出

行列から最大値・最大値を取るインデックス、最小値・最小値を取るインデックスを抽出する。

a = np.array([[1,3,5,7,9,11,13],
             [1,3,5,7,9,11,13],
             [1,3,5,7,9,11,13],
             [1,3,5,7,9,11,13],
             [1,3,5,7,9,11,13]])
b = np.array([[0],[1],[2],[3],[4]])

array = a + b
print(array)

#最大値・最小値を抽出
print(np.max(array))
print(np.amax(array))
print(array.max())

print(np.min(array))
print(np.amin(array))
print(array.min())
#実行結果
17
17
17
1
1
1

インデックスを抽出する場合は、array.argmax, array.argminを利用する。

#np.argmax(a,axis =0)は最大値をとる行、
#np.argmax(a,axis =1)は最大値をとる列、のインデックスを返す
a = np.array([[1,3,5,7,9,11,13],
[1,3,5,7,9,11,13],
[1,3,5,7,9,11,13],
[1,3,5,7,9,11,13],
[1,3,5,7,9,11,13]])
b = np.array([[0],[1],[2],[1],[0]])

array = a + b
print(array)

print(np.argmax(array,axis =0))
print(np.argmax(array,axis =1))

x_indexes = np.argmax(array,axis =0)
y_indexes = np.argmax(array,axis =1)

#最初のインデックスのみを抽出する
print(f"index = ({x_indexes[0]}, {y_indexes[0]})")
#実行結果
[2 2 2 2 2 2 2]
[6 6 6 6 6]
index = (2, 6)

平均値、中央値、総和の抽出

#行列の平均値、中央値、総和を抽出する
a = np.array([[1,3,5,7,9,11,13],
             [1,3,5,7,9,11,13],
             [1,3,5,7,9,11,13],
             [1,3,5,7,9,11,13],
             [1,3,5,7,9,11,13]])
b = np.array([[0],[1],[2],[1],[0]])

array = a + b
print(array)

#平均値
print(np.mean(array))
#中央値
print(np.median(array))
#総和
print(np.sum(array))
#実行結果
7.8
8.0
273

行列の形状を変換

Reshapeをつかって行列の形状を変換する。

a =np.array([[0,1,2,3],
[4,5,6,7],
[8,9,10,11]])

#2行6列の行列に変換
print(a.reshape(2,6))

#arange、reshapeを使ってデータを作成
b = np.arange(24).reshape(6,4)
print(b)
#実行結果
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]]

行列の結合

Concatenate - 2つの行列を結合する。行・列方向かをaxisで指定できる
stack, hstackを使うことでも行・列方向への結合ができる

a = np.arange(12).reshape(3,4)
b = a + 10
print(a)
print(b)

#行(垂直)方向に結合
print(np.concatenate([a,b], axis = 0))
print(np.vstack([a,b]))

#列(水平)方向に結合
print(np.concatenate([a,b], axis = 1))
print(np.hstack([a,b]))
#実行結果
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[10 11 12 13]
 [14 15 16 17]
 [18 19 20 21]]

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [10 11 12 13]
 [14 15 16 17]
 [18 19 20 21]]
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [10 11 12 13]
 [14 15 16 17]
 [18 19 20 21]]

[[ 0  1  2  3 10 11 12 13]
 [ 4  5  6  7 14 15 16 17]
 [ 8  9 10 11 18 19 20 21]]
[[ 0  1  2  3 10 11 12 13]
 [ 4  5  6  7 14 15 16 17]
 [ 8  9 10 11 18 19 20 21]]

累積和

#Cumsum - 累積和を計算。行方向・列方向の累積和も計算できる
a = np.arange(12).reshape(3,4)

#1次元行列に変換してから累積和を求める
print(np.cumsum(a))

#行方向の累積和を求める
print(np.cumsum(a, axis = 0))

#列方向の累積和を求める
print(np.cumsum(a, axis = 1))
#実行結果
[[ 0  1  2  3]
 [ 4  6  8 10]
 [12 15 18 21]]
[[ 0  1  3  6]
 [ 4  9 15 22]
 [ 8 17 27 38]]

行列の順序を崩さずに値を挿入

Searchsorted - 行列の順序を崩さずに値を挿入できる行列のインデックスを返す

Searchsorted - 行列の順序を崩さずに値を挿入できる行列のインデックスを返す

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

print(np.searchsorted(a,3))
print(np.searchsorted(a,[-10,10,2,3]))
#実行結果
2
[0 5 1 2]

乱数の生成

Randon - 乱数を作成し、シードを固定する。シードの固定にはnp.random.seedを用いる

#乱数シードの固定
np.random.seed(1000)

#100以上、1000未満の乱数を作成
print(np.random.randint(100,1000))

#100以上、1000未満の乱数を10個作成
print(np.random.randint(100,1000,10))

#0以上、1未満の乱数を10個作成(浮動小数点)
print(np.random.rand(10))
#実行結果
535
[699 171 804 351 450 448 869 545 740 957]
[0.89155181 0.79423773 0.62120974 0.49536639 0.34069679 0.35953137
 0.91578585 0.17371682 0.26454833 0.39753422]

整数・小数の乱数の他、正規分布・二項分布の確率密度に従う乱数を作成することもできる

#平均2.0、標準偏差0.5の正規乱数を10個作成(正規分布に従う乱数)
print(np.random.normal(2, 0.5, 10))

#平均0、標準偏差1.0の正規乱数を10個作成(標準正規分布に従う乱数)
print(np.random.rand(10))

#2項分布の乱数を100個作成(2項分布に従う乱数)
print(np.random.binomial(100, 0.3, 100))
#実行結果
[1.06062855 2.13897302 2.6204688  1.67272115 1.95599465 1.71068731
 2.33946184 2.85304051 2.40172919 1.01813903]
[0.57323007 0.42616067 0.91108957 0.49786576 0.6465168  0.70496804
 0.74647329 0.94348412 0.92162581 0.08418652]
[29 28 27 27 29 27 29 21 29 35 33 26 26 26 26 29 21 24 23 28 34 37 23 33
 35 29 29 34 30 33 32 26 27 27 32 28 23 33 32 31 32 34 30 35 34 27 31 33
 30 29 36 30 34 29 30 27 25 33 29 37 28 31 27 34 31 28 32 35 36 29 33 34
 40 32 28 34 31 31 26 25 19 30 29 28 37 30 34 31 26 32 35 38 25 28 35 35
 39 25 32 25]

シャッフル

Shuffle, Permutation - 1次元リストをシャッフルする。まずrandom.seedを実行してシードを固定する必要がある

np.random.seed(1000)
s = ["a","b","c","d","e"]

np.random.shuffle(s)
print(s)

#Permutation - シャッフル
a = np.random.permutation(s)
print(a)

#Permutation - 10個の整数をランダムシャッフルする
a = np.random.permutation(10)
print(a)

#Choise - 重複を許したうえで要素を取り出す
s = ["a","b","c","d","e"]
a = np.random.choice(s, 20)
print(a)
#実行結果
['c', 'b', 'a', 'e', 'd']
['a' 'c' 'b' 'e' 'd']
[5 2 7 0 6 3 4 1 8 9]
['d' 'a' 'e' 'c' 'c' 'e' 'a' 'e' 'e' 'd' 'b' 'd' 'd' 'a' 'c' 'b' 'd' 'd'
 'b' 'd']

今回はPythonの組み込み関数・Nupmyの出題範囲の総復習ができました。次回はPandas, Matplotの使い方について書く予定です。楽しみにしておきます!

この記事が気に入ったらサポートをしてみませんか?