NumPy は高水準の数値計算などをサポートする Python モジュールの 1 つである。NumPy ではベクトルや行列などのデータを扱うことが可能で、ベクトル演算や行列演算も高速に行える。NumPy は基本的にデータを配列型で管理している。例えば、ベクトルは 1 次元配列、行列は 2 次元配列として扱われる。
ベクトル
NumPy はデータを配列として扱う。そのため、ベクトルを作成するときは、1 次元の配列として作成する。
import numpy as np
vec = np.array([1, 1, 2, 3, 5, 8, 13, 21])
配列型のオブジェクトの次元数(ベクトルなら 1 次元)は ndim
メソッドで調べることができる。各次元に含まれている要素数は shape
メソッドで調べることができる。また、オブジェクト全体に含まれている要素数は size
メソッドで調べることができる。
vec.ndim
## 1
vec.shape
## (8, )
vec.size
## 8
NumPy で用意されたメソッドを利用して、ベクトルの最大値、最小値、平均値、合計値などを簡単に求めることができる。
import numpy as np
vec_a = np.array([1, 1, 2, 3, 5, 8, 13, 21])
np.sum(vec_a)
## 54
np.nansum(vec_b)
## 54.0
np.median(vec_a)
## 4.0
np.mean(vec_a)
## 6.75
np.std(vec_a)
## 6.6096520332011428
np.var(vec_a)
## 43.6875
np.amin(vec_a)
## 1
np.amax(vec_a)
## 21
np.ptp(vec_a)
## 20
np.percentile(vec_a, q = [0, 25, 50, 25, 100])
## [1.0, 1.75, 4.0, 1.75, 21.0]
ベクトル中に欠損値 NaN
が含まれている場合、以下のようなメソッドを利用することで、欠損値を無視して計算を行うことができる。
import numpy as np
vec_b = np.array([1, 1, 2, 3, 5, 8, 13, 21, np.nan])
np.nanmean(vec_b)
## 6.75
np.nanstd(vec_b)
## 6.6096520332011428
np.nanvar(vec_b)
## 43.6875
np.nanmin(vec_b)
## 1.0
np.nanmax(vec_b)
## 21.0
行列
行列型のデータは 2 次元配列として作成する。例えば、3 行 5 列の行列を作成する場合は、次のようにする。
import numpy as np
mat = np.matrix([[1, 1, 1, 1, 1],
[2, 3, 4, 5, 6],
[0, 2, 0, 4, 0]])
ベクトルと同様に、この配列型のオブジェクトに対して、次元数、各次元の要素数、全要素数を、それぞれ ndim
、shape
および size
メソッドで調べることができる。
mat.ndim
## 2
mat.shape
## (3, 5)
mat.size
## 15
R の行列のように範囲を添え字として指定することで、特定の行あるいは特定の列を取り出したりすることができる。
mat[1, 2]
## 4
mat[1, :]
## matrix([[2, 3, 4, 5, 6]])
mat[:, 2]
## matrix([[1],
## [4],
## [0]])
mat[0:2, 0:3]
## matrix([[1, 1, 1],
## [2, 3, 4]])
行列の行または列に関して、その最大値、最小値、平均値や合計値などを簡単に計算できる。その際に各メソッドの第 1 引数 axis に 0
または 1
を指定する。0
ならば 1 次元方向に、1
ならば 2 次元方向に演算を行う。
import numpy as np
mat = np.matrix([[1, 0, 2, 0, 3],
[1, 1, 2, 3, 5],
[2, 4, 6, 8, 10]])
mat.sum(0)
## matrix([[ 4, 5, 10, 11, 18]])
mat.median(0)
## matrix([[ 1., 1., 2., 3., 5.]])
mat.mean(0)
## matrix([[ 1.33333333, 1.66666667, 3.33333333, 3.66666667, 6. ]])
mat.std(0)
## matrix([[ 0.47140452, 1.69967317, 1.88561808, 3.29983165, 2.94392029]])
mat.var(0)
## matrix([[ 0.22222222, 2.88888889, 3.55555556, 10.88888889, 8.66666667]])
mat.min(1)
## matrix([[0],
## [1],
## [2]])
mat.max(1) # np.amax(mat, 1)
## matrix([[ 3],
## [ 5],
## [10]])
データファイルの読み書き
データをファイルに保存す
行列型のデータをファイルに保存するとき、savetxt
メソッドを利用する。ファイルに保存する際に、区切り文字を指定して保存することができる。
import numpy as np
mat = np.array([[23.41, 34.21, 11.22, 54.23, 42.12],
[1.135, 2.678, 3.789, 4.910, 5.011]])
mat
## array([[ 23.41 , 34.21 , 11.22 , 54.23 , 42.12 ],
## [ 1.135, 2.678, 3.789, 4.91 , 5.011]])
savetxt("data.txt", mat, delimiter = "\t")
ファイルの読み込み
タブ区切りのファイルあるいは CSV ファイルからデータを読み取る場合は loadtxt
メソッドまたは genfromtxt
メソッドを利用する。データファイルには数値のみあるいは文字列のみしか含まれていない場合は loadtxt
が利用できる。これに対して、データファイルに数値と文字列の両方が入っている場合は、genfromtxt
メソッドを利用すると便利である。
loadtxt
import numpy as np
mat = np.loadtxt("data.txt", delimiter = "\t")
mat
## array([[ 23.41 , 34.21 , 11.22 , 54.23 , 42.12 ],
## [ 1.135, 2.678, 3.789, 4.91 , 5.011]])
genfromtxt
import numpy as np
mat = np.genfromtxt("data.txt", dtype = np.float, delimiter = "\t")
mat
## array([[ 23.41 , 34.21 , 11.22 , 54.23 , 42.12 ],
## [ 1.135, 2.678, 3.789, 4.91 , 5.011]])
mat = np.genfromtxt("genes.txt", dtype = None, delimiter = "\t")
mat
## array([(b'gene_1', 11.11, 12.34, 4.44), (b'gene_2', 22.22, 23.45, 5.55),
## (b'gene_3', 33.33, 34.56, 6.66)],
## dtype=[('f0', 'S6'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8')])