こんにちは、この記事ではnp.arrayの要素の和を計算する関数、np.sum関数を紹介します。また、この関数はnp.arrayのメソッドとしても実装されています。
NumPyでは、生のPythonで実装された関数ではなく、NumPyに用意された関数を使うことで高速な計算が可能です。この記事でNumPyを使った効率的な計算の仕方について勉強していきましょう。
np.sum関数の引数と返り値
np.sum関数のパラメータ(引数)の中から、よく使われるものをまとめて紹介します。
numpy.
sum
(a, axis=None, dtype=None, out=None, keepdims=<no value>, initial=<no value>)
axisで指定した軸の要素の和を求めます。
Parameters: |
|
---|---|
Returns: |
|
使い方
以降のコードはJupyterで実行してみてください。まずはNumPyをimportします。ついでにサンプル配列も作っておきます。
In [1]:
import numpy as np
In [2]:
x = np.arange(10)
x2 = np.reshape(x,(2,5))
print("xn",x)
print("x2n",x2)
基本的な使い方
np.sumもarr.sumも使い方は同じです。まずはaxisを指定しない場合、配列内の要素は全て足し合わされます。
axisで合計値を出す軸を指定
axis=0とすると、列ごとに足し合わされます。axis=1とすると、行ごとに足し合わされます。
In [7]: np.sum(x2, axis=0) Out[7]: array([ 5, 7, 9, 11, 13]) In [8]: x2.sum(axis=0) Out[8]: array([ 5, 7, 9, 11, 13]) In [9]: np.sum(x2, axis=1) Out[9]: array([10, 35]) In [10]: x2.sum(axis=1) Out[10]: array([10, 35])
outパラメータで出力値を入れる配列を用意
sumの出力配列と同じshapeの配列を用意して、outに渡すとその配列を上書きして答えを返してくれます。新しい配列を作らない分だけ高速に動作します。
In [11]: x3 = np.zeros(2) x3 Out[11]: array([0., 0.]) In [12]: np.sum(x2, axis=1, out=x3) x3 Out[12]: array([10., 35.]) In [13]: x2.sum(axis=1, out=x3) x3 Out[13]: array([10., 35.])
dtypeで出力配列の型を指定
dtypeを指定しないと、適当な型が割り当てられます。例えばx3の中身を見てみると(In [14]とOut [14])、float64になっていますね。これは合計値を計算した配列がfloat64型だったためです。これを敢えて変更したい場合はdtypeに型を指定しましょう。
NaNが入った配列の要素和を計算する
配列内にNaNが入っている場合、通常のnp.sumやarr.sumでは計算結果がNaNになってしまいます。
この場合、NaNを無視して合計値を出すには、np.nansum関数を使います。
ただし、np.nansum関数は通常のnp.sum関数と比べて計算速度が遅いので、nanが入っている可能性がある場合にだけ使う事をおすすめします。
%%timeit
np.nansum(x2)
[計算にかかった時間]
%%timeit
np.sum(x2)
まとめ
この記事では、np.arrayの要素の合計を計算する機能、np.sum関数とarr.sumメソッドについて紹介しました。合計値を計算する関数は非常によく使う機能の一つです。平均を出す関数などと一緒にしっかりと覚えて、科学計算・機械学習の実装に役立ててください!
今回の記事は下記の記事を参考にしています。
参考記事: