プログラミング

【NumPy】Python(パイソン)で行列計算!配列関数の使い方を紹介

NumPyで出来ることは?使い方を解説!(Pythonライブラリ)

「Python(パイソン)で行列計算がしたい!」

「NumPy(ナムパイ)の基本的な使い方は?」

PythonのライブラリNumPyは行列演算を支援するライブラリで、高速なデータ処理を可能にします。

機械学習を行うためにデータを大量に扱う上で、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)
array関数

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)
arangeとreshape組み合わせ

配列からデータを抜き出そう!

次は、配列からデータを抜き出してみます。

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])
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])
2次元配列スライス

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の基本的な使い方を学びました。

NumPyで出来ること
  • N次元の行列の表現
  • 基本的な行列演算
  • 多くのライブラリのデータ表現に使用

大量のデータを扱う上で、NumPyの活用は必須になります。

ぜひ色々と活用してみてください^^

次は、Pythonでのグラフ描画を学びましょう♪

関連記事【Matplotlib】Python(パイソン)でグラフ描画!範囲指定や線や点の種類変更は?

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です