NumPy

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

ベクトルと同様に、この配列型のオブジェクトに対して、次元数、各次元の要素数、全要素数を、それぞれ ndimshape および 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')])