スライドショー

【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("x\n",x)
print("x2\n",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メソッドについて紹介しました。合計値を計算する関数は非常によく使う機能の一つです。平均を出す関数などと一緒にしっかりと覚えて、科学計算・機械学習の実装に役立ててください!

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

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

フクロウ

フクロウ

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

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説