【初心者向け】数値計算・データ処理で必須のNumPyを入門しよう!

NumPyとは

NumPy(ナムパイ/ナンパイ / Numerical Python)はPythonで数値計算を効率的に行うためのライブラリで、データ解析及び、線形代数を扱う上では必須のライブラリです。
NumPyを使うことでベクトルや行列などの多次元配列を作ることができます。
NumPyは、Matplotlib、Pandas、SciPyなどのPythonのライブラリと合わせてよく利用されます。
公式ドキュメント

なぜNumPyを学ぶのか

なぜNumPyを学ぶのかについてあらかじめ説明します。
NumPyは機械学習・ディープラーニングを扱う機械学習エンジニア(Pythonエンジニア)に取って、必須のライブラリといっても良いくらい、多く利用します。
NumPyは大規模なデータの処理に優れており、機械学習・ディープラーニングの現場で多く使います。
そのためNumPyは機械学習エンジニアにとって「最初の一歩」となるライブラリですので、是非この章でしっかり基礎を学んでいきましょう。

NumPyのインストール

pip コマンドを用いたNumPyのインストールは下記のコマンドでインストール出来ます。
Macの方はターミナル、Windowsの方はコマンドプロンプト上で実行することでインストールが出来ます。

pip install numpy

Jupyter Notebookをお使いの方は、起動したNotebookのセルに、先頭に!マークをつけて実行することでインストールすることが出来ます。

!pip install numpy

NumPyを使用する

import文を記述することで、NumPyを利用することが出来ます。

import numpy as  np

配列(アレイ)を作る

array()を使うことでNumPyの配列を作ることが出来ます。

import numpy as  np
x = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
print(x)
# array()は、Pythonのリストを渡すことでNumPy 用の配列(numpy.ndarray)を生成します。

x = np.array([1,2,3])
print(x) # [1 2 3]
print(type(x)) # <class 'numpy.ndarray'>

my_list1 = [1,2,3,4,5]
my_array1 = np.array(my_list1) # numpyのarrayを作る

my_list2 = [10,20,30,40,50]
my_lists = [my_list1, my_list2] # リストのリストを作る。
my_lists # [[1, 2, 3, 4, 5], [10, 20, 30, 40, 50]] # リストのリストが完成。

# my_listsを使ってNumPyのアレイを使る。(多次元配列を作る)
my_array2 = np.array(my_lists)

my_array2 # 2行5列の配列ができる。
"""
array([[ 1,  2,  3,  4,  5],
       [10, 20, 30, 40, 50]])
"""

# 次のように、タプルを複数渡すとエラーになってしまいます。
np.array((1,2,3),(4,5,6))

"""
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: data type not understood
"""

NumPy配列の形状を調べる

NumPy配列(ndarray)の形状を調べるにはshapeというインスタンス変数を使うことで調べることができます。
※インスタンス変数とはオブジェクトのインスタンスごとに割り当てられた変数のこと(個々のインスタンスに格納される変数)です。
詳しくは、クラスとオブジェクトのテキストをご確認ください。

import numpy as np
a = np.array([1, 2, 3, 4])
a.shape # (4,)が出力される。これは1次元配列でかつ、4つ要素があることを意味します。

b = np.array([[1, 2],[3,4]])
b.shape # (2, 2) これは行列で、2行2列を意味しています。

配列の生成 arange()

arange()はpythonのfor文で使ったrange()関数と似た関数です。
range()同様に引数に渡した数の配列を生成します。

import numpy as  np
# データの準備
# 等間隔の数字
# 0から9までの数字(配列)を生成
x = np.arange(10)
print(x)

# reshape()は配列を形状に変換します
x = np.arange(1, 10).reshape(3,3) # 3×3の多次元配列に変換
y = np.arange(1, 10).reshape(3,3) # 3×3の多次元配列に変換
"""
xを下記のように書き換えることも可能
x = np.reshape(x, (3,3))
"""
print(x)
print(y)

print(x + y)
print(x - y)
print(x * y)

配列操作

NumPyでは再形成といって、配列の次元を変更することが可能です。

import numpy as np
sample_array = np.arange(10)
print(sample_array)

# reshapeを使って配列の形状を指定
sample_array2 = sample_array.reshape(2,5)
print(sample_array2) #array(([0,1,2,3,4],[5,6,7,8,9]])

# concatenateを使って、データの結合する(axisで行方向か、縦方向を指定可能)
sample_array3 = np.array([[1,2,3],[4,5,6]])
sample_array4 = np.array([[7,8,9],[10,11,12]])

# 行方向に結合 ([[1,2,3,7,8,9],4,5,6,10,11,12]])
print(np.concatenate([sample_array3,sample_array4],axis=1))

# hstackでも行方向の結合が可能
print(np.hstack((sample_array3,sample_array4)))



"""
axis=0で列方向
axis=1で行方向です。
下記URLを参考ください。
https://qiita.com/shuetsu@github/items/2bf8bba233c5ecc7a0ad
"""

# axisに0を設定しているので、列方向 ([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
print(np.concatenate([sample_array3,sample_array4],axis=0))

# vstackで列方向の結合が可能
print(np.vstack((sample_array3,sample_array4)))

ブロードキャスト

ブロードキャストは、配列の大きさが異なっていれば、自動的に要素をコピーし大きさを揃えるNumPyの機能です。

import numpy as np
# データの準備
sample_array = np.arange(10)
print(sample_array)

# 上記の配列に「5」を足す計算
# 要素をコピーして大きさを揃えて、配列の全ての要素に5を加算
print(sample_array + 5)

多次元配列の計算

多次元配列とは、数字の集合であり、N次元状に数字を並べたものです。
数字が1列に並んだり、長方形状に並べたり、3次元状に並べたものなどです。
1次元、2次元、3次元、・・・N次元

import numpy as np

n1 = np.array([1,2,3,4,5])
print(n1) # [1 2 3 4 5]

# 配列の次元数は np.ndim() 関数で取得可能
np.ndim(n1) # 1 -> 1次元

# 配列の形状取得にはshapeを使う。タプルでかえってくる
n1.shape # (5,) # 変数n1の形状を取得

"""
2次元配列 (5,3)

3次元配列 (5,5,4)

1次元でも2次元でも、同様にタプルで結果が返される。
"""

# 3行2列の配列(2次元の配列)を作成

"""
2次元配列は行列のことを意味します。
3 × 2 の配列は、最初の次元に3つ要素があり、
次の次元に2つの要素があるという意味。

行(row) 配列の横方向
列(column) 配列の縦方向
"""

n2 = np.array([[1,2], [3,4], [5,6]])
print(n2)

"""
[[1 2]
 [3 4]
 [5 6]]
"""
print(n2.ndim) # 2

行列とは

行列は、数や記号や式などを行と列に沿って配列したものです。
数学の線形代数学周辺分野で出てきます。
早速例を見てみます。

上の図は2行5列(2×5行列)の行列の例です。
行列では、
横のことを、行
縦のことを、列
と言います。
次は、4行2列のの行列です。

Pythonでは以下のように表します。

import numpy as np
my_li1 = [-1,4]

my_li2 = [3,2]

my_li3 = [2,5]

my_li4 = [0,1]

my_lists = [my_li1,my_li2,my_li3,my_li4]

my_array3 = np.array(my_lists)

my_array3
"""
array([[-1,  4],
       [ 3,  2],
       [ 2,  5],
       [ 0,  1]])
"""

行列 成分

行列のi行j列目にある数のことを、(i,j)成分と呼びます。
数学的には、以下のような行列があった場合、(3,2)成分は5になります。
同様に、(4,1)成分は0です。

ただし数学的に、行列では要素は一番左上の要素を(1,1)としますが、pythonでは(0,0)とするので注意が必要です。(pythonのリストにおいて、a = [1,2,3]の時、a[0]は1を指します。)
よって上の行列をpythonで扱う場合、(0,0)の成分は、-1です。
(3,0)の成分は0です。(4,1)の成分はありません。
また成分は要素とも呼ばれます。

まとめ

この章では、NumPyでよく使うメソッドやブロードキャストなどのNumPyの基本的な内容を学びました。
NumPyは非常に便利かつよく利用するライブラリですので、使いこなせるようになりましょう。