【NumPy入門 np.sum】要素の和を求めるnp.sum関数とarr.sumメソッド

こんにちは、この記事ではnp.arrayの要素の和を計算する関数、np.sum関数を紹介します。また、この関数はnp.arrayのメソッドとしても実装されています。

NumPyでは、生のPythonで実装された関数ではなく、NumPyに用意された関数を使うことで高速な計算が可能です。この記事でNumPyを使った効率的な計算の仕方について勉強していきましょう。

目次

np.sum関数の引数と返り値

np.sum関数のパラメータ(引数)の中から、よく使われるものをまとめて紹介します。

参考:SciPy.org

numpy.sum(aaxis=Nonedtype=Noneout=Nonekeepdims=<no value>initial=<no value>)

axisで指定した軸の要素の和を求めます。

Parameters:
: array_like

和を計算する要素

axis : None(指定しない) or int型 or int型の入ったタプル型, このパラメータはoptionalです。

合計を計算する軸を指定します。

dtype : dtype, optional

返り値のデータ型を指定。指定しなければパラメータから適当な型になります。

out : ndarray, optional

結果を代入する配列を指定できます。指定しなければ新しい配列を作ります。

keepdims : bool, optional
initial : scalar, optional
Returns:
sum_along_axis : ndarray

パラメータに従って計算した合計値を格納した配列を返します。

使い方

以降のコードは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)
Out:
x
 [0 1 2 3 4 5 6 7 8 9]
x2
 [[0 1 2 3 4]
 [5 6 7 8 9]]

基本的な使い方

np.sumもarr.sumも使い方は同じです。まずはaxisを指定しない場合、配列内の要素は全て足し合わされます。

In [3]:

np.sum(x)

Out[3]:

45

In [4]:

x.sum()

Out[4]:

45

In [5]:

np.sum(x2)

Out[5]:

45

In [6]:

x2.sum()

Out[6]:

45

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に型を指定しましょう。

In [14]:

x3.dtype

Out[14]:

dtype('float64')

In [15]:

x4 = np.sum(x2, axis=1, dtype=np.float32)
x4

Out[15]:

array([10., 35.], dtype=float32)

NaNが入った配列の要素和を計算する

配列内にNaNが入っている場合、通常のnp.sumやarr.sumでは計算結果がNaNになってしまいます。

In [16]:

x5 = np.array([np.nan, 1.0, 2.0])

In [17]:

np.sum(x5)

Out[17]:

nan

In [18]:

x5.sum()

Out[18]:

nan

この場合、NaNを無視して合計値を出すには、np.nansum関数を使います。

In [19]:

np.nansum(x5)

Out[19]:

3.0

ただし、np.nansum関数は通常のnp.sum関数と比べて計算速度が遅いので、nanが入っている可能性がある場合にだけ使う事をおすすめします。

In [20]:
%%timeit 
np.nansum(x2)

[計算にかかった時間]

5.32 µs ± 429 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [21]:
%%timeit 
np.sum(x2)
[計算にかかった時間]
2.85 µs ± 24.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

まとめ

この記事では、np.arrayの要素の合計を計算する機能、np.sum関数とarr.sumメソッドについて紹介しました。合計値を計算する関数は非常によく使う機能の一つです。平均を出す関数などと一緒にしっかりと覚えて、科学計算・機械学習の実装に役立ててください!

今回の記事は下記の記事を参考にしています。
参考記事:

この記事を書いた人

第一言語はPythonです。
皆さんRustやりましょう。

目次