「Python(パイソン)で行列計算がしたい!」
「NumPy(ナムパイ)の基本的な使い方は?」
PythonのライブラリNumPyは行列演算を支援するライブラリで、高速なデータ処理を可能にします。
機械学習を行うためにデータを大量に扱う上で、NumPyは必須になります。
- N次元の行列の表現
- 基本的な行列演算
- 多くのライブラリのデータ表現に使用
以下、Jupyter notebook(ジュピターノートブック)を使って実際にPythonのコードを書いていきます。
まだPythonの環境を構築していない方はこちらの記事をお読みください。
関連記事Python(パイソン)環境をAnaconda(アナコンダ)で構築!Jupyter notebookの使い方は?
今回は、NumPyの使い方を学んでみましょう!
NumPyで配列を作成してみよう
ここでは、NumPyの基本的な使い方を学びます。
まずは、NumPyで配列を作成してみます。
array関数
配列の作成にはarray関数を使います。
import numpy as np #NumPyのインポート
a = np.array([1,2,3]) #1次元の配列生成
print(a)
b = np.array([[1,2,3],[4,5,6]]) #2次元の配列生成
print(b)
zeros関数、ones関数、empty関数
ゼロ配列、イチ配列、カラ配列を作成することができます。
- ゼロ配列:要素が0のみ
- イチ配列:要素が1のみ
- カラ配列:要素が空
カラ配列はゼロ配列やイチ配列よりも生成速度が速いため、中身を気にせず構造のみ欲しい場合に使われます。
#ゼロ行列3x4
zeros3x4 = np.zeros((3,4))
print(zeros3x4)
#イチ行列2x2x2、int型
ones2x2x2 = np.ones((2,2,2),dtype = np.int64)
print(ones2x2x2)
#カラ行列1x2
empty1x2 = np.empty((1,2))
print(empty1x2)
arange関数、linspace関数
規則的な配列を生成するには、arange関数、linspace関数を使います。
arangeはarray rangeの略です^^
#0から始まる連続する10の整数の配列
c = np.arange(10)
print(c)
#np.arange(始,終,間隔)
d = np.arange(10,30,5)
e = np.arange(0,2,0.3)
print(d)
print(e)
#等間隔な数列を生成、np.linspace(始,終,個数)
f = np.linspace(0,np.pi,10)
print(f)
arange関数は終わりの値を含まない配列、linspace関数は終わりの値を含むので注意。
ndim、shape、size、dtype
ndim、shape、size、dtypeを使うことで、配列の特徴を知ることが出来ます。
array2x3 = np.array([[1,2,3],[4,5,6]])
#次元数
print(array2x3.ndim)
#行列の形
print(array2x3.shape)
#要素数
print(array2x3.size)
#型
print(array2x3.dtype)
astype関数
データの型の変換にはastype関数を使います。
#型を指定して配列を作成
a_str = np.array([1,2,3],dtype =str)
print(f"文字列型:{a_str}")
#int型に変換
a_int = a_str.astype(np.int)
print(f"int型:{a_int}")
#float型に変換
a_float = a_str.astype(np.float)
print(f"float型:{a_float}")
#複素数型に変換
a_complex = a_str.astype(np.complex)
print(f"複素数型:{a_complex}")
reshape関数、ravel関数、転置
reshape関数やravel関数を使うことで配列の形を変えることができます。
また、.Tで転置行列になります。
#6要素の配列を生成
array = np.array([1,2,3,4,5,6])
print(array)
#arrayを2x3行列に整形
array2x3 = array.reshape(2,3)
print(array2x3)
#arrayを3x2行列に整形
array3x2 = array.reshape(3,2)
print(array3x2)
#行列を1次元にほどく
a = array2x3.ravel()
print(a)
#転置行列
a2x3_T = array2x3.T
print(a2x3_T)
arange関数とreshape関数の組み合わせ
arange関数とreshape関数を組み合わせることで様々な配列を作成することが出来ます。
#0~14の配列を3x5に整形
array3x5 = np.arange(15).reshape(3,5)
print(array3x5)
#3次元以上配列を生成
array2x3x4 = np.arange(24).reshape(2,3,4)
print(array2x3x4)
#行列数のいずれかに-1を入れると自動で大きさを計算
array3x5xY = np.arange(60).reshape(3,5,-1)
#配列の形を確認
print(array3x5xY.shape)
配列からデータを抜き出そう!
次は、配列からデータを抜き出してみます。
1次元配列をスライス
1次元配列を色々と取り出すことが出来ます。
- a[x]:x番目の要素
- a[x,y]:x番目とy番目の要素
- a[x:y]:xからy-1番目の要素
- a[x:y:z]:xからy-1番目までのzおきの要素
要素は0番目から始めるので注意です^^
import numpy as np #NumPyのインポート
a = np.array(list("あいうえおか"))
print(a)
#2番目を取り出す
print(a[2])
#2番目と3番目を取り出す
print(a[[2,3]])
#0番目から3番目を取り出す
print(a[0:4])
#0番目から3番目まで2つおきに取り出す
print(a[0:4:2])
#配列を後ろから取り出す
print(a[::-1])
2次元配列をスライス
次は、2次元配列をスライスしてみます。
b = np.arange(25).reshape(5,5)
print(b)
#3列目すべて
print(b[:,3])
#2行3列目の要素
print(b[2,3])
#(1,3)行と(1,3)列が交わる組み合わせ
print(b[1:4:2,1:4:2])
#対角成分(行列番号が同じ)
print(b[range(5),range(5)])
#最終要素
print(b[-1])
ndenumerate関数
ndenumerate関数を使うことで配列の要素を走査(スキャン)することが出来ます。
a = np.array([[1,2],[3,4],[5,6]])
print(a)
#座標とそれに対応する値を取り出す
for i, value in np.ndenumerate(a):
print(f"{i}:{value}")
where関数、select関数
条件にあった要素を抜き出すなら、where関数とselect関数を使います。
a = np.arange(20).reshape(4,5)
print(a)
#aの要素が3の倍数なら1,それ以外は0
b = np.where((a>0)&(a%3 ==0),1,0)
print(b)
#aの要素が5より小さいなら-1,10より大きいなら10倍
c = np.select([a<5, a>10],[-1, a*10])
print(c)
配列を使った計算をしてみよう!
配列での演算をすることができます。
Pythonでは基本的に要素ごとの計算になります。
行列の計算する場合はdot関数(A @ B)を使います。
加算 | A + B | np.add(A,B) |
要素積 | A * B | np.multiply(A,B) |
乗算 | A @ B | np.dot(A,B) |
割り算 | A / B | np.divide(A,B) |
a = np.array([0,1,2,3,9])
b = np.array([2,4,6,8,0])
print(a + b) #足し算
print(a + 3)
print(a - b) #引き算
print(a - 3)
print(a * b) #要素の掛け算
print(a @ b) #行列の掛け算
print(a ** b) #累乗
print(np.sqrt(a)) #平方根
print(a / b) #割り算
print(100 // b) #商の整数
print(100 % b) #剰余
さあNumPyを使ってみよう!
今回はNumPyの基本的な使い方を学びました。
- N次元の行列の表現
- 基本的な行列演算
- 多くのライブラリのデータ表現に使用
大量のデータを扱う上で、NumPyの活用は必須になります。
ぜひ色々と活用してみてください^^
次は、Pythonでのグラフ描画を学びましょう♪
コメント