Python入門:基本のNumPyの使い方 (1次元配列)


はじめに

NumPyについて、基本的な使い方をまとめました。

動作環境

OS:MacOS 11.2.3(Big Sur)
Python:3.9.0
NumPy:1.20.2

基本操作

NumPy配列の生成

以下の例のように、list配列からNumPy配列を生成する方法があります。

sample01
>>> import numpy as np
>>> a = np.array([0, 0.5, 1.0, 1.5, 2.0])  #list配列から生成
>>> type(a)
numpy.ndarray
>>> a = np.array(list('abc'))              #文字列のリスト配列から生成
>>> a
array(['a', 'b', 'c'], dtype='<U1')

単純な数値のシーケンスを要素として生成するためにarange()関数が用意されています。

numpy.arange(start, end, step)

startからend - 1までの数字の順列をstep飛ばしで作成します。startは何も指定しないと0となります。stepは何も指定しないと1です。

sample02
>>> import numpy as np
>>> a = np.arange(8)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7])
>>> a = np.arange(1, 8)
>>> a
array([1, 2, 3, 4, 5, 6, 7])
>>> a = np.arange(1, 8, 2)
array([1, 3, 5, 7])
>>> a = np.arange(8, dtype=float)   #データ型を指定できる。
array([0., 1., 2., 3., 4., 5., 6., 7.])

list配列と同様に、スライス機能もあります。

sample03
>>> import numpy as np
>>> a = np.arange(8)
array([0, 1, 2, 3, 4, 5, 6, 7])
>>> a[:5]
array([0, 1, 2, 3, 4])
>>> a[5:]
array([5, 6, 7])

ndarrayクラスの組み込みメソッド

統計学でよく使われる平均や分散、標準偏差など、多数の関数をメソッドとして持っています。いくつか例をあげます。

sample04
>>> import numpy as np
>>> a = np.arange(8, dtype=float)
>>> a
array([0., 1., 2., 3., 4., 5., 6., 7.])
>>> a.sum()   #総和
28.0
>>> a.mean()  #平均
3.5
>>> a.var()   #分散 
5.25
>>> a.std()   #標準偏差
2.29128784747792
>>> a.cumsum() #先頭要素からの累積和
array([ 0.,  1.,  3.,  6., 10., 15., 21., 28.])

ベクトル演算

NumPyでは、ベクトル演算が定義されています。これによって複雑な演算処理のコーディングもシンプルに作成できます。

sample05
>>> import numpy as np
>>> a = np.arange(8, dtype=float)
>>> a
array([0., 1., 2., 3., 4., 5., 6., 7.])
# 各要素に定数を加算
>>> a + 3
array([ 3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])
# 定数を各要素に加算
>>> 3 + a
array([ 3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])
# 同じオフセットの要素の和
>>> a + a
array([ 0.,  2.,  4.,  6.,  8., 10., 12., 14.])
# 各要素を定数倍
>>> a * 3
array([ 0.,  3.,  6.,  9., 12., 15., 18., 21.])
# 各要素をベキ乗
>>> a ** 2
array([ 0.,  1.,  4.,  9., 16., 25., 36., 49.])
# 同じオフセットの要素の乗算
>>> a ** a
array([ 0.,  1.,  4.,  9., 16., 25., 36., 49.])

NumPyに定義されているスタティックの数理関数

数学で使われる指数関数や平方根、logなどもNumPyパッケージに含まれています。

sample06
>>> import numpy as np
>>> a = np.arange(8, dtype=float)
>>> a
>>> np.exp(a) #要素ごとに指数演算
array([1.00000000e+00, 2.71828183e+00, 7.38905610e+00, 2.00855369e+01,
       5.45981500e+01, 1.48413159e+02, 4.03428793e+02, 1.09663316e+03])
>>> np.sqrt(a) #要素ごとに平方根
array([0.        , 1.        , 1.41421356, 1.73205081, 2.        ,
       2.23606798, 2.44948974, 2.64575131])
>>> np.log(a) #要素ごとにlog関数を適用。ただし、要素が'0'についてはWarningが表示され、計算結果も’-inf'となります
array([      -inf, 0.        , 0.69314718, 1.09861229, 1.38629436,
       1.60943791, 1.79175947, 1.94591015])

Pythonでの数理関数にはmathパッケージもあります。単一の要素を計算する場合は、mathの方が計算速度が早いです。pythonのコマンドインタプリタでは、%timeitを実行する関数の前に記載することで、処理速度を計測できます。

sample07
>>> import numpy as np
>>> import math
>>> %timeit np.sqrt(4)
1.05 µs ± 13.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)  #µs = マイクロ秒  (1秒 = 1,000,000µs)
>>> %timeit math.sqrt(4)
129 ns ± 6.05 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each). #ns = ナノ秒  (1µs = 1,000ns)
>>>

上記の例を見ても、mathパッケージに比べるとNumPyの方が処理速度が落ちますので、注意しなければなりません。

等間隔の1次元配列の生成

aからbをx等分した場合の配列を作成することができます。

sample08
>>> import numpy as np
>>> a = np.linspace(0,5,12) #0から5までを12等分する
>>> a
array([0.        , 0.45454545, 0.90909091, 1.36363636, 1.81818182,
       2.27272727, 2.72727273, 3.18181818, 3.63636364, 4.09090909,
       4.54545455, 5.        ])