NumPy

NumPy は Python パッケージの一つであり、基本的な数値計算などの機能をサポートしている。NumPy で生成されるデータは narray クラスのオブジェクトとして取り扱われる。多くのデータタイプや演算操作が narray クラスのメソッドとして定義されている。

インストール

NumPy はパッケージとして配布されているので、pip3 コマンドを利用して簡単にインストールできる。なお、Python 2.7 系を利用している場合は pip コマンドを利用する。

pip3 install numpy

管理者権限を持たないサーバー上にインストールするとき --user オプションをつける。

pip3 install numpy --user

ベクトル

ベクトルの作成は NumPy モジュールの array メソッドを利用する。

import numpy as np
vec = np.array([1, 1, 2, 3, 5, 8, 13, 21])

作成したベクトルの次元数、要素数などは以下のように調べることができる。size は要素数で、shape は各次元の長さをタプルで表したものである。

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

行列

行列は NumPy の matrix メソッドを利用して作成する。また、array を利用して二次元配列として作成することもできる。

import numpy as np

mat = np.matrix([[1, 1, 1, 1, 1],
                 [2, 3, 4, 5, 6],
                 [0, 2, 0, 4, 0]])

作成した行列の次元数、要素数などは以下のように調べることができる。

mat.ndim
## 2

mat.shape
## (3, 5)

mat.size
## 15

行列の行または列要素にアクセスするときは以下のようにする。

mat[1, 2]
## 4

mat[1, :]
## matrix([[2, 3, 4, 5, 6]])

mat[:, 2]
## matrix([[1],
##         [4],
##         [0]])

行列の行または列に関して、その最大値、最小値、平均値や合計値などを簡単に計算できる。その際に各メソッドの第 1 引数 axis0 または 1 を指定する。0 ならば 1 次元方向に、1 ならば 2 次元方向に演算を行う。なお、array で生成されている配列オブジェクトは np.sum(mat, 0) などのようにオブジェクトを代入して演算を行う。

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)       # np.sum(mat, 0)
## matrix([[ 4,  5, 10, 11, 18]])

mat.median(0)    # np.sum(mat, 0)
## matrix([[ 1.,  1.,  2.,  3.,  5.]])

mat.mean(0)      # np.mean(mat, 0)
## matrix([[ 1.33333333,  1.66666667,  3.33333333,  3.66666667,  6.        ]])

mat.std(0)       # np.std(mat, 0)
## matrix([[ 0.47140452,  1.69967317,  1.88561808,  3.29983165,  2.94392029]])

mat.var(0)       # np.var(mat, 0)
## matrix([[  0.22222222,   2.88888889,   3.55555556,  10.88888889,   8.66666667]])

mat.min(1)       # np.amin(mat, 1)
## matrix([[0],
##         [1],
##         [2]])

mat.max(1)       # np.amax(mat, 1)
## matrix([[ 3],
##         [ 5],
##         [10]])

データファイルの読み込みと書き出し

NumPy を利用してタブ区切りのファイルを読み込んだりする際に loadtxt メソッド、データをファイルに保存する際に savetxt を利用する。

NumPy を利用して行列データを作成し、保存する例。

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

実際に保存されたデータを Linux の cat コマンドで見ると以下のように見える。

cat data.txt
## 2.341000000000000014e+01	3.421000000000000085e+01	1.122000000000000064e+01	5.422999999999999687e+01	4.211999999999999744e+01
## 1.135000000000000009e+00	2.677999999999999936e+00	3.789000000000000146e+00	4.910000000000000142e+00	5.011000000000000121e+00

ファイルの読み込みは以下のようにする。

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

loadtxt の他に 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]])

genfromtxt メソッドを利用することで文字列と数値の両方を含むデータファイルを読みこむこともできる。例えば以下のようなファイルを genfromtxt で読み込んでみる。

cat genes.txt
gene_1  11.11   12.34   4.44
gene_2  22.22   23.45   5.55
gene_3  33.33   34.56   6.66
import numpy as np

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