配列と行列

二次元配置のデータは NumPy では matrix 型または array 型として取り扱う。array 型の中で、二次元配列を再定義した型が matrix 型となり、array 型のメソッドがそのまま matrix 型にも利用できる。両者はほぼ同じように取り扱うことはできるが、行列演算のところでやや異なる動作が見られる。

arr_a = np.array([[1, 2], [3, 4]])
arr_b = np.array([[1, 1], [1, 1]])

mat_a = np.mat([[1, 2], [3, 4]])
mat_b = np.mat([[1, 1], [1, 1]])

arr_a
## array([[1, 2],
##        [3, 4]])

mat_a
## matrix([[1, 2],
##         [3, 4]])

次元数や要素数などを調べる方法。

arr_a.ndim
## 2
arr_a.shape
## (2, 2)
arr_a.size
## 4
mat_a.ndim
## 2
mat_a.shape
## (2, 2)
mat_a.size
## 4

配列型と行列型とでは *** 演算子の動作に違いが見られる。

arr_a * arr_b
## array([[1, 2],
##        [3, 4]])

np.dot(arr_a, arr_b)
## array([[3, 3],
##        [7, 7]])

mat_a * mat_b
## matrix([[3, 3],
##         [7, 7]])

arr_a ** 2
## array([[ 1,  4],
##        [ 9, 16]])

np.dot(arr_a, arr_a)
## array([[ 7, 10],
##        [15, 22]])

mat_a ** 2
## matrix([[ 7, 10],
##         [15, 22]])

mat_a ** (-1)
## matrix([[-2. ,  1. ],
##         [ 1.5, -0.5]])

行列の行または列に関して、その最大値、最小値、平均値や合計値などを簡単に計算できる。その際に各メソッドの第 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]])