Python入門 Numpy基礎①

はじめに

これから、Pythonを使ったデータ分析の基礎についてまとめていきます。

まず初めは、Pythonの代表的な数値計算ライブラリであるNumpyです。

多次元配列や行列を簡単に操作できるため、機械学習だけでなく様々な分野で活用されています。

Numpyのインポート

下記でNumpyのライブラリをnpとしてインポートします。

以降はnumpyの代わりにnpと記述することで、numpyのメソッドを使用できるようになります。

import numpy as np

基本的な配列の生成

numpyを用いた配列の作成にはnp.arrayメソッドを用います。()の中には配列の要素を引数として記述します。

np.array(1)
# array(1)
np.array([1, 2, 3])
# array([1, 2, 3])
np.array([[1, 2], [3, 4], [5, 6]])
# array([[1, 2],
#        [3, 4],
#        [5, 6]])

リスト・配列・numpy.ndarrayの違い

Pythonにおける配列の使い分けに関しては、こちらが参考になります。

numpy.ndarrayは、同じ型のみを要素に格納する必要がありますが、様々な数値計算が可能なメソッドを使用することができます。

list_A = ['apple', 2, 'lemon', 3.5]
ndarray = np.array([2, 3, 4, 5])
print(type(list_A))
print(type(ndarray))

# <class 'list'>
# <class 'numpy.ndarray'>

形状の確認

shape属性を参照することで、配列の形状を確認できます。

array_A = np.array([1, 2, 3])
array_A.shape
# (3,)

array_B = np.array([[1, 2], [3, 4], [5, 6]])
array_B.shape
# (3, 2)

次元数・データ型・要素数の確認

ndarrayの次元数、データ型、要素数は下記のメソッドで確認することが可能です。

array_B.ndim
# 2

array_B.dtype
# dtype('int32')

array_B.size
# 6

形状の変換

形状の変換にはreshapeメソッドを使います。

特に列ベクトルへの変換は、重要です。下記における-1は、配列の要素数である6と同じ意味となります。

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

array.reshape(2, 3)
# array([[1, 2, 3],
#        [4, 5, 6]])

array.reshape(-1, 1)
# array([[1],
#        [2],
#        [3],
#        [4],
#        [5],
#        [6]])

配列の一部選択と抽出

配列の中から一部を選択する場面は多く存在します。特にスライス” : “の用法に関する理解が重要です。

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

# 1行目を抽出
array[0]
# array([1, 2])

# 2行目以降を抽出
array[1:]
# array([[3, 4],
#        [5, 6]])

列ごとの要素を抜き出す

# 2列目を抽出
array[:, 1]
# array([2, 4, 6])

三角関数

numpyでは、三角関数の計算も容易に行うことが可能です。

np.pi
# 3.141592653589793

array = np.array([[0, np.pi/2], [-np.pi/2, np.pi]])
array
# array([[ 0.        ,  1.57079633],
#        [-1.57079633,  3.14159265]])

np.sin(array)
# array([[ 0.0000000e+00,  1.0000000e+00],
#        [-1.0000000e+00,  1.2246468e-16]])

np.cos(array)
# array([[ 1.000000e+00,  6.123234e-17],
#        [ 6.123234e-17, -1.000000e+00]])

# ラジアンから角度に変換
array_deg = np.rad2deg(array)
array_deg
# array([[  0.,  90.],
#        [-90., 180.]])

# 角度からラジアンに変換
array_rad = np.deg2rad(array_deg)
array_rad
# array([[ 0.        ,  1.57079633],
#        [-1.57079633,  3.14159265]])

条件による選択

下記のように、条件式を記述することで、TrueかFalseで表されるBool型の結果を得ることができます。

これによって、条件にあった値を選択することも可能です。

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

array > 4
# array([[False, False],
#        [False, False],
#        [ True,  True]])

array[array > 4]
# array([5, 6])

ある条件を満たす要素を置き換えるときは、whereメソッドを使うと便利です。

引数の内容は( 条件、 置き換える値、 条件を満たさない要素の値 )です。

# 0.0以上、1.0未満の乱数を乱数を20個生成
test = np.random.rand(20)
test
# array([0.86340343, 0.24434387, 0.04961183, 0.68203389, 0.56948935,
#        0.1174531 , 0.00220156, 0.24731936, 0.92980599, 0.61403651,
#        0.42284744, 0.18860281, 0.38268615, 0.85486854, 0.74753164,
#        0.29520657, 0.57888868, 0.45987332, 0.87003017, 0.28654137])

test = np.where(test < 0.5, 0, 1)
test
# array([1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0])

# 条件y<0.5を満たす要素を0に、満たさない要素を1に置き換え
X = np.arange(20).reshape(-1, 1)
y = np.random.rand(20)
y = np.where(y < 0.5, 0, 1).reshape(-1, 1)
X[:][y==1]
# array([ 2,  3,  6,  7, 10, 11, 13, 14, 15, 16, 17, 18])

次回以降も、Pythonの基礎知識についてまとめていきます。