データサイエンス・機械学習を行うに当たって、Numpyの基本的な操作と個人的によく使う機能をまとめました。
NumpyはPythonの科学技術計算に特化したライブラリで、ベクトルや行列などの表現が可能。
公式ドキュメント: http://www.numpy.org/
Numpy基本機能
###0.ライブラリのインポート
import numpy as np
###1.配列の作成
■ 1次元配列 np.array()
>>> np.array([1, 2, 3])
array([1, 2, 3])
■ 2次元配列 np.array()
>>> np.array([[1, 2, 3], [4, 5, 6]])
array([1, 2, 3],
[4, 5, 6]])
■ print関数で配列をすっきり表示
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
[[1 2 3]
[4 5 6]]
■ 全ての要素が0である行列を返す np.zeros()
>>> np.zeros((2, 4)) #引数に配列の形態を入力
array([0, 0, 0, 0],
[0, 0, 0, 0]])
■ 全ての要素が1である行列を返す np.ones()
>>> np.ones((3, 3)) #引数に配列の形態を入力
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
■ range関数のような連続する1次元の行列を作る(Numpy版 range関数) np.arange()
>>> np.arange(11) #0から1までの連続値
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
>>> np.arange(0, 16, 3) #0から15までの3ずつ大きくなる連続値
array([0, 3, 6, 9, 12, 15])
■ 指定した範囲内で等間隔に分割された値の行列を作る np.linspace()
>>> np.linspace(0, 5, 9) #0から5までの範囲を9つに均等に分割 (9つの分割点を返す)
array([0., 0.625, 1.25, 1.875, 2.5, 3.125, 3.75, 4.375, 5.])
■ 単位行列の生成 np.eye()
>>> np.eye(3, 3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
■ 全て指定の数値の配列の生成 np.full()
>>> np.full((4, 2), 123)
array([[123, 123],
[123, 123],
[123, 123],
[123, 123]])
###2.配列の情報を確認
- .ndim : 行列の次元を表します。最初に何個 "[" が続いているかに対応します。
- .shape : 各次元の要素数を表示。
- .size : 行列の要素の全個数です。
- .dtype : 要素のデータ型を表します。
a = np.array([[1, 2, 3], [4, 5, 6]])
>>> a.shape #各次元の要素数を確認
(2, 3)
###3.配列の参照・変形など
■ インデックス・スライス操作
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
[[1 2 3]
[4 5 6]]
>>> a[0, 2] #1行目の3列目の値を表示
3
>>> a[-1, 1] #後ろから1行目(この場合は2列目)の2列目の値を表示
5
print(a[:, 2]) #全行の3列目を表示(:は全てを意味する)
[3 6]
a = np.array([0, 1, 2, 3, 4, 5])
>>> a
[0 1 2 3 4 5]
print(a[:4]) #4つ目まで表示
[0 1 2 3]
print(a[2:5]) #3つ目から5つ目まで表示
[2 3 4]
■ 配列の変形 .reshape()
a = np.array([0, 1, 2, 3, 4, 5])
>>> a
[0 1 2 3 4 5]
>>> a.reshape(3, 2) #3×2に変形
array([[0, 1],
[2, 3],
[4, 5]])
#指定した配列の要素数が合わない場合はエラーになる
■ その他
- .ravel() : 行列を1次元に変換する
- .flatten() : 行列を1次元に変換する
- .T : 行列を転置させる
- .diagonal() : 対角要素を表示
###4.乱数
Python標準のrandomモジュールとは別に、Numpyにも乱数発生機能がある。
■ 0以上1未満の乱数を生成 np.random.random()
>>> np.random.random(10)
array([0.03554718, 0.74723843, 0.27291435, 0.26284813, 0.79078377,
0.00814339, 0.41940143, 0.81117724, 0.98409866, 0.38093226])
■ 乱数の固定 np.random.seed()
np.random.seed(0) #同じ乱数が生成される
■ 0以上1未満の高次元の乱数配列生成 np.random.rand()
>>> np.random.rand(3, 4)
array([[0.85371393, 0.87247222, 0.09849451, 0.84980366],
[0.17332104, 0.84787819, 0.98709454, 0.99205639],
[0.78306371, 0.8567189 , 0.75677948, 0.60070442]])
■ 指定範囲内の乱数を生成 np.random.randint() / np.random.uniform()
>>> np.random.randint(1, 10, (2, 3))
#1次元の場合はタプルでなく数値を入力
#1から10までの整数をランダム生成 <10は出ない>
array([[3, 1, 4],
[8, 9, 2]])
>>> np.random.uniform(1, 10, (2, 3))
#1から10までの小数値をランダム生成
array([[6.04938728, 8.58981204, 2.71022283],
[5.7859627 , 7.2292891 , 9.7463006 ]])
■ 平均0、標準偏差1の標準正規分布に従う乱数の出力 np.random.randn()
>>> np.random.randn(3, 2)
array([[ 0.48735179, 1.70962469],
[-0.1878482 , -0.22249371],
[-0.71046488, -1.26965019]])
■ 任意の平均、標準偏差の正規分布に従う乱数の出力 np.random.normal()
>>> np.random.normal(0, 1, (3, 2)) #平均0、標準偏差1、3行2列 で指定
array([[ 0.44271636, 0.0011947 ],
[-0.11190774, 0.88837843],
[-0.32281972, 0.62059076]])
###5.ユニバーサル関数
Numpyの関数はメソッド呼び出し可能
- .sum() : 合計
- .max() : 最大値
- .min() : 最小値
- .mean() : 平均値
- .var() : 分散
- .std() : 標準偏差
- .abs() : 絶対値
- .floor() : 四捨五入
axisで行<0>と列<1>を指定可能
- .min(axis=0) 最小の行を表示
- .min(axis=1) 最小の列を表示
###6.その他機能
■ 内積の計算 np.dot()
vector_a = np.array([1, 2, 3])
vector_b = np.array([4, 5, 6])
>>> np.dot(vector_a, vector_b)
32
■ 配列に対して自作の関数を適用したい場合 np.vectorize()
np.vectorizeは、関数を配列に適用できるように変換する関数
a = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# ラムダ式で1000を足す関数を作成
add_1000 = lambda x: x + 1000
# np.vectorize()に関数を読み込む
vectorized_add_1000 = np.vectorize(add_1000)
# 配列aに適用
>>> vectorized_add_1000(a)
array([[1001, 1002, 1003],
[1004, 1005, 1006],
[1007, 1008, 1009]])