Numpyの配列の基礎【忘備録】 | Python

Python
スポンサーリンク

Numpyとは

NumpyはPythoでベクトルや、行列の計算を高速に行う科学技術ライブラリ。
Pythonが機械学習で広く使われている背景にはNumpyなどの科学技術計算に必要なライブラリが充実しているため。
また、Numpyは標準のPythonには含まれない外部ライブラリであるため初めにライブラリを読み込む作業が必要になる。

Numpyのインストール

ターミナルまたは、コマンドラインから、

pip3 install numpy

と入力すればインストールできる。

最新バージョンにアップデート

pip3 install numpy --upgrade

Numpy配列の基礎

Numpyのインポート

import numpy as np

numpyはasをつけてnpと略される。

np.ndarrayは、N次元配列を扱うためのクラスで数学の概念でいえば、1次元の場合はベクトル、2次元の場合は行列、3次元以上はテンソルに該当する。

配列の生成はnp.ndarrayにもコンストラクタはあるが通常はnp.array()関数によって生成される。

配列の作成
np.array(object, type = None)

要素が1,2,3である長さ3のベクトル

>>>a = np.array([1, 2, 3])
>>>a
array([1,2,3])

タプルを使った表現も可能

>>>a = np.array((1, 2, 3))
>>>a
array([1, 2, 3])

リストの要素にnp.ndarrayやタプルを含むことも可能

>>> a = np.array([5.0,6.0,7.0])
>>> b = np.array([a, (10, 20, 30)])
>>> b
array([[5., 6., 7.],
      [10., 20., 30.]])

Numpyリファレンスマニュアル
The N-dimensional array (ndarray)

その他の関数

np.array()以外でよく使うのもの。

np.zeros(shape, dtype = None)

np.ones(shape, dtype =None)

※shapeは各配列の次元の長さを表したもので、大きさ5のベクトルはスカラー5、2 x 3 の行列はタプル(2, 3)で表される。

長さが3の0ベクトル

>>> np.zeros(3)
array([0., 0., 0.])

3 x 4 の1行列

>>> np.ones((3, 4))
array([[1., 1., 1., 1.],
      [1., 1., 1., 1.],
      [1., 1., 1., 1.]])

単位行列を生成する関数

np.identity(n, type = None)

n=2のとき、単位行列は正方形なので 2 x 2の行列になる

>>> np.identity(2)
array([[1., 0.,],
      [0., 1.]])

ユニバーサル関数

ユニバーサル関数はndarrayの各要素に対して演算子た結果を返す関数。
要素ごとの計算なので多次元配列にも使うことができる。

#引数が1つのもの

#絶対値を返す関数
np.abs()

#要素のe(自然対数の底)のべき乗を返す関数
np.exp()

#要素の平方根を返す関数
np.sqrt()

#引数が2つのもの

#要素同士の和を返す関数
np.add()

#要素同士の差を返す
np.subtract()

#要素同士の最大関数を格納した配列を返す関数
np.maximum()

乱数

np.randomモジュールで乱数を生成することができる。

# 0以上1未満の一様乱数を生成する関数
np.random.rand()

# x以上y未満の整数をz個生成する関数
np.random.randint(x, y, z)

# ガウス分布に従う乱数を生成する関数
np.random.normal()

Random sampling (numpy.random)

ブロードキャスト

>>> a = np.array([[1, 2], [3, 4]])
>>> b = np.array([10, 20])
>>> a * b
array([[10, 40],
     [30, 80]])

1次元配列である b が2次元配列の a と同じ形状になるように変形されて要素ごとの計算を行う。

転置行列

行と列を入れ替えることを転置という。

>>> a = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
>>> a
array([[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]])

#転置(引数を指定しないとき)
>>> a.T
array([[1, 4, 7],
     [2, 5, 8],
     [3, 6, 9]])

#転置(引数を指定する場合)
np.transpose(a, axes = None)
>>> np.transpose(a)
array([[1, 4, 7],
     [2, 5, 8],
     [3, 6, 9]])

ベクトルの内積や行列の積

ベクトルの内積や行列積を求めることができる

np.dot(a, b)
>>> a = np.array([[2, 3, 4],[5, 6, 7]])
>>> b = np.array([[5, 6],[7, 8],[9, 10]])
>>> np.dot(a, b)
array([[ 67,  76],
       [130, 148]])

このとき、『行列の形状(shape)』に注意する。行列 a の1次元目の要素数(列数)と行列 b の0次元目の要素数(行数)を必ず一致させる。
行列a → a.shape (2 x 3)
行列b → b.shape (3 x 2)

配列の最大要素のインデックスを返す

#多次元配列の中の最大値の要素を持つインデックスを返す関数
np.ndarray.argmax(axis = None)
np.argmax(a, axis = None)

>>> a = np.array([4, 6, 3, 1, 8, 3, 9])
>>> a
array([4, 6, 3, 1, 8, 3, 9])
>>> np.argmax(a)
6
>>> a.argmax()
6

#多次元配列での動作
#最大値の最初のインデックスを返す

>>> b = np.random.randint(10, size = (3,4))
>>> b
array([[7, 9, 7, 9],
       [6, 9, 2, 5],
       [5, 7, 5, 7]])
>>> np.argmax(b)
1
>>> b.argmax()
1

#列方向に最大のインデックスを返す
>>> np.argmax(b, axis = 0)
array([0, 0, 0, 0])
>>> b.argmax(axis = 0)
array([0, 0, 0, 0])

#行方向に最大のインデックスを返す
>>> np.argmax(b, axis = 1)
array([1, 1, 1])
>>> b.argmax(axis = 1)
array([1, 1, 1])

コメント