前回はNumPy配列の構造を確認する方法および要素の指定方法(インデックス、スライシング)について紹介しました。
https://www.learning-nao.com/?p=2498
今回は配列での計算処理についてです。NumPy配列では各要素に対して計算処理が可能です。本記事では、配列での計算方法とその挙動(結果)を確認していきます。また、平均や合計といった計算ができる関数も用意されているので、それについても紹介します。
計算
四則演算
Numpyでは配列同士で足し算や引き算といった四則演算が可能です。配列同士で計算した場合、各配列のインデックスごとに計算が実行されます。
以下に足し算の例を示します。配列aとbの0番目同士および1番目同士足し合わせた結果の配列が返されます。
a = np.array([1, 2])
b = np.array([1, 2])
a + b
>> array([2, 4])
その他演算も同様の規則で実行されます。
#引き算
a - b
>> array([0, 0])
#掛け算
a * b
>> array([1, 4])
#割り算
a / b
>> array([1., 1.])
この計算は各要素ごとに実行されるので、計算に用いる配列の要素数が一致していなければエラーとなってしまいます。
以下のように要素数が異なる配列で計算はできません。
a = np.array([1, 2])
b = np.array([1, 2, 3])
a + b
>> ValueError: operands could not be broadcast together with shapes (2,) (3,)
ブロードキャスト
先の例では配列のインデックスごとに計算をしていましたが、全ての要素に一律の計算を実行することもできます。この方法はブロードキャストと呼ばれます。
ブロードキャストは配列に単一の数を足したり引いたりすることで実行できます。
a = np.array([1, 2])
a + 2
>> array([3, 4])
a * 2
>> array([2, 4])
ブロードキャストは以下のように異なる次元の配列同士でも実行可能です。
a = np.array([[ 0.0, 0.0, 0.0],
[10.0, 10.0, 10.0],
[20.0, 20.0, 20.0],
[30.0, 30.0, 30.0]])
b = np.array([1.0, 2.0, 3.0])
a + b
>> array([[ 1., 2., 3.],
[11., 12., 13.],
[21., 22., 23.],
[31., 32., 33.]])
この場合、aの最小単位での配列の要素数とbの要素数が一致している必要があります。これが一致していない場合はエラーとなります。
便利な関数
NumPyでは、数学的な計算や統計量を求めることができる関数が多数用意されています。これらの関数は、配列内の値をから算出します。
その中のいくつかを以下に紹介します。
a = np.array([1, 2, 3, 4, 5])
#最大
a.max()
>> 5
#最小
a.min()
>> 1
#合計
a.sum()
>> 15
#平均
a.mean()
>> 3.0
#標準偏差
a.std()
>> 1.4142135623730951
二次元配列の場合
二次元配列を対象にする場合は、軸を指定して集約することもできます。軸ごとに集約する場合は引数にaxisを指定します。0だと列方向、1だと行方向に集約します。
a = np.array([[ 0.0, 0.0, 0.0],
[10.0, 10.0, 10.0],
[20.0, 20.0, 20.0],
[30.0, 30.0, 30.0]])
#列方向に集約
a.sum(axis=0)
>> array([60., 60., 60.])
#行方向に集約
a.sum(axis=1)
>> array([ 0., 30., 60., 90.])
#全ての要素の和
a.sum()
>> 180.0
これはsum()以外の関数でも同様です。
Pythonでデータサイエンスするなら
Pythonでデータサイエンスをするなら、以下の書籍がおすすめです。Pandas、matplotlib、Numpy、scikit-learnといったデータサイエンスに必要なライブラリを、体系立てて一通り学ぶことができます。
ややお値段高めですが、これ1冊で十分という内容・ボリュームなので、損はしないと思います^^
まとめ
NumPy配列の計算について紹介しました。
配列同士の演算とブロードキャストの挙動はきちんと確認しておいて損はないと思います。また、NumPyには便利な関数が多数用意されています。今回紹介した関数以外にもまだまだあるので、興味がある方は是非調べてみてください^^
ではでは👋