NumPyはPythonで有名な数値計算ライブラリあり、機械学習やディープラーニングなどのAIには無くては欠かせないものです。
今回は、このNumPyに関する基礎について解説致します。
最初の準備(インストールとインポート)
まず初めに NumPy をインストールしなければなりません。
NumPyは Anaconda をインストールするとPythonと一緒にインストールされますが、もし anaconda を使わず python を直接インストールしたのであれば、次のコマンドを実行することでインストールされます。
1 2 3 4 5 |
# anaconda を使わず pythonを直接インストールしていた場合 pip install numpy #anaconda を使ってインストールする場合 conda install numpy |
インストールされている環境では、プログラムの先頭に次の1行を記述することで使えるようになります。
1 |
import numpy as np |
多くのサンプルにおいて、numpyは np という略称で使われることが多いようです。
この記事でも、np と記述していれば、それは numpy であると解釈して下さい。
NumPyの基礎
Numpyは arrayメソッドを使って1次元配列、2次元配列、3次元配列、n次元配列などの多次元配列を作成し、様々な数値計算を行わせることが可能です。
まず、良く使われる1次元配列、2次元配列について、その作り方を見ていきましょう。
1次元配列と2次元配列
データは arrayメソッドの引数としてリスト、又はタプルを渡します。
ちなみに、np は NumPy クラスの略称です。

2次元配列には縦方向と横方向の軸があり、演算を行う際にどの方向に向かって計算を行うかを指定する場合があります。
縦方向を指定する場合は axis=0、横方向を指定する場合は axis=1 と覚えておいてください。
pandas の場合は行操作が axis=0,列操作が axis=1 でしたので、numpy は行をまたぐ計算(つまり縦方向)が axis=0、列をまたぐ計算(つまり横方向)がaxis=1 と考えると覚えやすいかもしれません。
では、次に3次元配列を見ていきます。
3次元配列(多次元配列)
3次元以上は多次元配列となりますが、図で表せるのは3次元配列までなので、まず3次元配列の説明をします。
下記はそのイメージですが、2次元配列が複数並んだ形になります。

3次元配列には、縦方向、横方向、奥行きの3軸が必要ですが、この場合は縦軸は axis=1、横軸は axis=2、奥行きは axis=0 になります。
2次元の場合と異なるので注意しましょう。
また、多次元配列については、リストの入れ子を深くしていくことで表現できます。
NumPy が扱うデータ型について
np.array で作成した配列は、ndarray (正確には numpy.ndarray) という型で保持されています。
この ndarray は高次元配列と呼ばれ、全ての要素は同じデータ型となります。

np.arrayにデータを渡す際、dtype 引数を使って要素のデータ型を指定することも出来ます。
np.array(データ,dtype=データ型)
データ型は文字列(‘int64’ 等) 、型Code(‘i8’)、 numpy の定数 (np.int64 等)で指定することが出来ます。
1 2 |
np.array([[1,2,3],[4,5,6],dtype=np.int64) np.array([[1,2,3],[4,5,6],dtype='int64') |
ndarray における要素のデータ型が知りたい場合は、ndarray のインスタンスが持つ dtype プロパティで判定できます。
1 2 3 4 5 6 7 |
# 2次元のndarrayを作成 data = np.array([[1,2,3],[4,5,6]]) # dtypeプロパティを表示 print( data.dtype ) # dtype('int32') と表示される |
個々の要素に使えるデータ型については以下の通りです。
データ型 | 型 | 内容 |
---|---|---|
numpy.int8 | i1 | -128 ~ 127(符号あり8ビット整数型) |
numpy.int16 | i2 | -32768 ~ 32767(符号あり16ビット整数型) |
numpy.int32 | i4 | -2147483648 ~ 2147483647(符号あり32ビット整数型) |
numpy.int64 | i8 | -9223372036854775808 ~ 9223372036854775807(符号あり64ビット整数型) |
numpy.uint8 | u1 | 0 ~ 255(符号なし8ビット整数型) |
numpy.uint16 | u2 | 0 ~ 65535(符号なし16ビット整数型) |
numpy.uint32 | u4 | 0 ~ 4294967295(符号なし32ビット整数型) |
numpy.uint64 | u8 | 0 ~ 18446744073709551615(符号なし64ビット整数型) |
numpy.float16 numpy.half | f2 | 半精度浮動小数点型(符号部1ビット、指数部5ビット、仮数部10ビット) |
numpy.float32 | f4 | 倍精度浮動小数点型(符号部1ビット、指数部8ビット、仮数部23ビット) |
numpy.float64 numpy.float_ | f8 | 倍精度浮動小数点型(符号部1ビット、指数部11ビット、仮数部52ビット) |
numpy.float128 | f16 | 倍精度浮動小数点型(符号部1ビット、指数部15ビット、仮数部112ビット) |
numpy.complex64 | c8 | 実部・虚部がそれぞれfloat32の複素数 |
numpy.complex128 numpy.complex_ | c16 | 実部・虚部がそれぞれfloat64の複素数 |
numpy.complex256 | c32 | 実部・虚部がそれぞれfloat128の複素数 |
numpy.bool_ | ? | bool型(True 又は False) |
unicode | U | Unicode文字列 |
object | O | Pythonオブジェクト型 |
要素の範囲指定(スライシング)
以前の記事で説明した通り、Pythonではリストやデータフレームのように配列を扱うデータ型においては、配列の添え字に始点と終点を記述することにより、その範囲だけ値を取り出したり、置き換えることが出来ました。
ndarray も配列を扱うデータ型なので、同じ方法で範囲を指定することが可能です。
ndarrayのインスタンス[始点,終点,ステップ]

値の追加、挿入、削除
配列に対して、データの追加、挿入、削除を行うメソッドが用意されています。
xは対象となる配列データ、val は追加/挿入したい配列、axis は追加/挿入する軸(行又は列),
pos は挿入又は削除の位置を
axis を省略した場合、対象となる配列データが何次元であろうと、無条件に1次元配列に変換され、追加/挿入/削除が実行されます。
機能 | 仕様 | 例 |
---|---|---|
追加 | np.append(対象配列,追加したい配列,追加したい軸) | np.append(data,[[1,2],[3,4]],axis=0 |
挿入 | np.insert(対象配列,挿入位置、挿入したい配列,挿入したい軸) | np.insert(data,3,[[1,2],[3,4]],axis=1 |
削除 | np.delete(対象配列,削除位置) | np.delete(data,2,axis=0) |
append
axis=0で行追加、axis=1で列追加となりますが、行追加の場合は列数を、列追加の場合は行数を合わせておく必要があります。

insert
insertの場合、第2引数に指定された位置に挿入されます。
配列は0から始まりますので、1を指定した場合は下図の通りとなります。
また、axis=1の場合は append と異なる挿入のされ方になりますので、ご注意ください。

delete
deleteの場合、第2引数に指定された要素、行、列が1つだけ削除されます。

指定した条件のデータのみ数値計算(where)
NumPyの where メソッドを使えば、配列の要素に対して、指定した条件に一致するか否かに応じた値を返すことが出来ます。
np.where(条件式,真の時に返す値、偽の時に返す値)
具体的な記述例は次の通りです。
1 2 3 4 5 6 7 |
data = np.array([[1,2,3],[4,5,6],[7,8,9]]) data1 = np.array([[-1,-2,-3],[-4,-5,-6],[-7,-8,-9]]) data2 = np.array([[10,20,30],[40,50,60],[70,80,90]]) np.where(data < 5,1,-1) np.where((2 <= data) & (data <= 7,data * -1,data * 10) np.where(data <=5,data1,data2) |
data という2次元配列に対して条件式を適用し、真の場合は1,偽の場合は-1 などの固定値を返すことで、1と-1だけの値を持つ新たな2次元配列を作ることが出来ます。
この時、真の値を返す第3引数、偽の値を返す第4引数には計算式を指定することも可能なので、data の値に応じて-1倍したり、10倍することが出来ます。

更に、全く別の配列data1,data2 を用意しておけば、dataの値に応じて data1又はdata2の値を返すことも可能です。

ブルーインデックス参照
ブルーインデックスは、添え字部分に条件式を書くことで、その条件に合った要素に対して操作が出来る機能です。
例えば、data=np.array([[1,2,3],[4,5,6],[7,8,9]]) という2次元配列を定義したとして、添え字部分に data < 5と記述すると、[1,2,3,4] という一次元配列が返されます。
この場合、配列が何次元であっても1次元配列として結果が返されます。

しかし、このブルーインデックスに対して値を代入(例えば data[data < 5] = 0)すると、条件に合った要素の値のみを書き換えることが可能です。

配列 data に対して条件式を指定すると、その条件に合った要素はTrue、それ以外は False という値を持った配列を作成できます。

この方法で作成した配列(ここでは mask) を別の配列の添え字に指定することで、別の配列に対してマスク処理を行うことが可能です(もちろん、自分自身に対しても同様に可能です)。

ブロードキャスト
異なった次元を持つ配列同士を計算する場合、自動的に軸を増やしてくれる機能がブロードキャストです。
例えば、下記の様に 1次元配列の data1 と 2次元配列のdata2 に対して加算をすると、data1の1次元配列がコピーされ、2次元配列としてdata2に加算してくれます。
これは加算に限らず配列同士の演算全てに対して行われます。

もちろん、同じ値を使って演算したい時だけに有効ですが、機械学習で用いる行列計算は同じ値を異なる次元の配列に対して演算するケースが多く、この機能は多用されています。
尚、どの様な場合でもブロードキャストが働くわけではなく、下図の様に横にコピーしても縦にコピーしても絶対に揃わないケースではエラーになります。

ファイルの読み書き
ndarray の内容をCSVファイルとしてファイルに書き込んだり、CSVファイルを読み込んで ndarray を新たに作成することが可能です。
np.loadtxt(ファイル名,delimiter=区切り文字,skiprows=スキップする行数)
np.savetxt(ファイル名,delimiter=区切り文字)
NumPy がCSVを読む際、CSVにヘッダが含まれているとエラーになります。
これを回避するため、skiprows でヘッダ行数だけ読み飛ばします。
CSVを読み込む際は整数であっても浮動小数点に変換されます。
逆にCSVに保存する際も浮動小数点として保存されます。

スカラーを使った四則演算
単一の値(スカラー値)を使って配列に対して四則演算が可能です。
この場合、全ての要素に対してスカラー値が適用されます。
配列を行列として考えることが出来ますので、3×3の行列に対してスカラー値 n を掛け算した場合、次の様になります。

では、具体的な数値を入れて四則演算を行ってみましょう。
1 2 3 4 5 6 7 |
import numpy as np data = np.array([[1,2,3],[4,5,6],[7,8,9]]) print(data + 1) print(data - 1) print(data * 2) print(data / 2) |


配列同士の四則演算
配列同士においても四則演算が可能です。
この場合は各要素同士での計算が行われます。

足し算、引き算については通常の行列計算と同じ計算方法になりますが、掛け算については行列の積と異なる計算になってしまいます。
そこで、NumPy には 行列計算の積を求めるメソッドとして dot が用意されています。
ndarrayのインスタンス.dot(行列)
例えば、次のような計算になります。
1 2 3 4 5 |
data1 = np.array([[1,2,3],[4,5,6],[7,8,9]]) data2 = np.array([[10,20,30],[40,50,60],[70,80,90]]) #行列の掛け算 print(data1.dot(data2)) |

関数一覧
NumPyには数多くの関数が用意されていますので、良く使われるものについて紹介しておきます。
Numpyの関数(メソッド)には、Numpyクラスに実装されているものと、ndarrayのインスタンスに実装されているものとの2通りがあります。
Numpyに実装されている関数(メソッド)は、引数で渡された全ての要素に対して実行されます。

一方、ndarrayから呼び出すものについては、axis 引数の指定(なし、0、1)によって挙動が変わります。
今回取り上げた関数のなかで「統計量」が該当しますので、詳細はそこで説明します。
四則演算、絶対値、切り捨て、切り上げ、四捨五入
下記の一覧において、xは計算対象データ(スカラー又は配列)、b は計算を行わせたい任意の値(スカラー又は配列)、c は四捨五入における小数の位を表しています。
足し算 | np.add(x,b) |
引き算 | np.subtract(x,b) |
掛け算 | np.multiply(x,b) |
割り算 | np.divide(x,b) |
余り | np.mod(x,b) |
絶対値 | np.fabs(x) |
切り捨て | np.floor(x) ※値が小さい方の整数にする np.trunc(x) ※小数部分を切り捨てる |
切り上げ | np.ceil(x) |
四捨五入 | np.round(x,c) np.around(x,c) np.rint(x) |
0に近い方向の整数 | np.fix(x) |
累乗、平方根、指数関数
累乗 | np.power(x,b) |
平方根 | np.sqrt(x,vb) |
指数関数 | np.exp() |
対数関数(底:e) | np.log(np.e) |
対数関数(底:2) | np.log2(x) |
対数関数 log(1+x) | np.log1p(x) |
三角関数
三角関数 | np.sin(x) |
三角関数 | np.cos(x) |
三角関数 | np.tan(x) |
逆三角関数 | np.arcsin(x) |
逆三角関数 | np.arccos(x) |
逆三角関数 | np.arctan(x) |
radian→degree | np.rad2deg(x) |
degree→radian | np.deg2rad(x) np.radians(x) |
双曲関数
双曲線関数 | np.sinh(x) |
双曲線関数 | np.cosh(x) |
双曲線関数 | np.tanh(x) |
逆双曲線関数 | np.arcsinh(x) |
逆双曲線関数 | np.arccosh(x) |
逆双曲線関数 | np.arctanh(x) |
複素数
実部 | np.real(x) |
虚部 | np.imag(x) |
複素共役 | np.conj(x) |
絶対値 | np.absolute(x) |
統計量
統計量はndarrayのインスタンスのメソッドを用います。
引数には計算方向の軸を指定することが可能で、0にすると行方向,1にすると列方向に計算されます。
axisを省略した場合は全ての要素を対象に計算が行われ、1つの答えが返されます。

合計 | data.sum(axis) | |
平均 | data.mean(axis) | |
中央値 | median(axis) | |
最大 | data.max(axis) | |
最小 | data.min(axis) | |
標準偏差 | data.std(axis,ddof) | ddof を省略すると母標準偏差となり、ddof=1にすると不偏標準偏差となる |
分散 | data.var(axis,ddof) | ddof を省略すると母分散となり、ddof=1にすると不偏分散となる |
累積和 | cumsum(axis) | |
累積積 | cumprod(axis) |
定数
ネイピア数e | np.e ※2.718281828459045 |
円周率π | np.pi ※3.141592653589793 |
まとめ
今回はPythonの数値計算で有名なNumPyについて解説しました。
NumPyは配列に対して様々な数値計算を適用するためのライブラリであり、機械学習によく用いられています。
NumPyには数多くの機能があり、全て網羅することは出来ませんので、基本的な考え方や使用頻度の高い機能につ絞って紹介しました。
NumPyの取っ掛かりとしてこの記事を活用して頂ければありがたいです。