NumPyの合計・和を取得する関数とメソッドまとめ

NumPyでは、配列の合計・和を取得する方法として、以下の7つの関数・メソッドが備えられています。

  • np.sum: 配列の要素の和を取得
  • ndarray.sum: 同上。メソッド版
  • np.nansum: 同上。(NaN無視)
  • np.cumsum: 配列の要素の累積和を取得
  • ndarray.cumsum: 同上。メソッド版
  • np.cancumsum: 同上。(NaNを0として処理)
  • np.add: 2つの配列の要素ごとの和を取得

ここではそれぞれ簡潔に解説していきます。

目次

1. sum: 配列の要素の合計を取得

NumPyには、配列の要素の合計を求める関数・メソッドとして以下の3つがあります。

  • np.sum()関数
  • ndarray.sum()メソッド
  • np.nansum()関数

まず、np.sum()ndarray.sum()は関数とメソッドという違いはありますが、使い方は全く同じです。ただし処理速度で言えば、ndarray.sum()メソッドの方がnp.sum()関数よりも1.5倍ほど高速です。そのため基本的にはメソッドの方を使うと良いでしょう。

また、np.sum()np.nansum()の違いは、配列の要素に欠損値NaNが含まれる場合の扱いにあります。この場合、np.sum()はnanを返しますが、np.nansum()はnanを無視して他の要素の合計値を返します。なおnansum()にはメソッドはありません。

それでは、それぞれ確認していきましょう。

1次元配列の場合

それでは以下の1次元配列a を使って確認していきましょう。

In [1]:
import numpy as np
rng = np.random.default_rng()
a = rng.integers(0, 10, (3, ))
a
Out[1]:
array([2, 1, 8])

この配列a をnp.sum()関数に渡すと全要素の合計値を返します。

In [2]:
np.sum(a) # 関数
Out[2]:
11

メソッドも同様です。

In [3]:
a.sum() # メソッド
Out[3]:
11

多次元配列の場合

多次元配列の場合はどうでしょうか。以下の2次元配列を例に見てみましょう。

In [1]:
import numpy as np
rng = np.random.default_rng()
a = rng.integers(0, 10, (3, 5))
a
Out[1]:
array([[7, 9, 6, 5, 7],
       [8, 3, 5, 2, 0],
       [5, 0, 2, 2, 8]])

デフォルトでは多次元配列の全要素の合計値を返します。

In [2]:
# デフォルトでは全要素の合計値を返す
np.sum(a)
Out[2]:
69
In [3]:
a.sum() # メソッド
Out[3]:
69

次元軸の指定

オプション引数 axis で合計値を求める次元軸を指定することができます。以下のコードは、1次元軸(行方向)の要素の合計値を返しています。

In [4]:
# 1次元軸(行方向)の要素の合計値を返す
np.sum(a, axis=-1)
Out[4]:
array([34, 18, 17])
In [5]:
a.sum(axis=-1) # メソッド
Out[5]:
array([34, 18, 17])

以下のコードは、2次元軸(列方向)の要素の合計値を返しています。

In [6]:
# 2次元軸(列方向)の要素の合計値を返す
np.sum(a, axis=0)
Out[6]:
array([20, 12, 13,  9, 15])
In [7]:
a.sum(axis=0) # メソッド
Out[7]:
array([20, 12, 13,  9, 15])

要素に欠損値NaNが含まれる場合

要素に欠損値NaNが含まれる場合も確認してみましょう。以下の配列を使っていきます。

In [1]:
import numpy as np
a = np.array([10, 20, np.nan])
a
Out[1]:
array([10., 20., nan])

このように配列に欠損値が含まれる場合、np.sum()ndarray.sum()もnanを返します。

In [2]:
# np.sum()もndarray.sum()もnanを返す
np.sum(a)
Out[2]:
nan
In [3]:
a.sum()
Out[3]:
nan

しかしnp.nansum()は欠損値を無視して合計を取得します。

In [4]:
# np.nansum()はnanを無視して合計値を返す
np.nansum(a)
Out[4]:
30.0

このような違いがあるので使い分けると良いでしょう。

なお、いずれもオプション引数dtype で要素のデータ型を指定したり(主に計算精度が高いfloat64に変える際に使う)、keepdims で元の配列の次元数を維持したり(主にブロードキャスト可能にするために使う)、initial で足し算の開始値を指定してたり、where で特定の行や列のみを指定したりといったことが可能です。詳しくは以下の記事で解説しているので、ぜひご確認ください。

2. cumsum: 配列の要素の累積和を取得

配列の要素の累積和を求めるには、以下の関数・メソッドが用意されています。

  • np.cumsum()関数
  • ndarray.cumsum()メソッド
  • np.nancumsum()関数

まず、np.cumsum()関数とndarray.cumsum()メソッドがあります。これらも使い方はまったく同じです。ただしndarray.cumsum()メソッドの方が3倍以上高速なので、基本的にはメソッドを使うと良いでしょう。

np.cumsum()関数とnp.nancumsum()関数の違いは、配列の要素に欠損値NaNが含まれる場合の扱いにあります。この場合、np.cumsum()はnanを返しますが、np.nancumsum()はnanを0として処理します。なおnansum()にはメソッドはありません。

それでは使い方を見ていきましょう。

1次元配列の場合

まずは以下の1次元配列を例に見てみましょう。

In [1]:
import numpy as np
rng = np.random.default_rng()
a = rng.integers(0, 10, (3, ))
a
Out[1]:
array([7, 6, 1])

この配列a をnp.cumsum()関数に渡すと、要素の累積和を戻します。

In [2]:
np.cumsum(a) # 関数
Out[2]:
array([ 7, 13, 14])

メソッドも同様です。

In [3]:
a.cumsum() # メソッド
Out[3]:
array([ 7, 13, 14])

多次元配列の場合

続いて多次元配列の場合も見ていきましょう。以下の2次元配列を使います。

In [1]:
import numpy as np
rng = np.random.default_rng()
a = rng.integers(0, 10, (2, 3))
a
Out[1]:
array([[6, 3, 9],
       [4, 2, 3]])

デフォルトでは、配列のshapeに関わらず、全要素の累積和を戻します。

In [2]:
np.cumsum(a) # 関数
Out[2]:
array([ 6,  9, 18, 22, 24, 27])
In [3]:
a.cumsum() # メソッド
Out[3]:
array([ 6,  9, 18, 22, 24, 27])

次元軸の指定

オプション引数 axis で累積和を求める次元軸を指定することができます。以下では1次元軸方向(横方向)の累積和を戻しています。

In [4]:
# 1次元軸(行方向)の要素の合計値を返す
np.cumsum(a, axis=-1)
Out[4]:
array([[ 6,  9, 18],
       [ 4,  6,  9]])
In [5]:
a.cumsum(axis=-1) # メソッド
Out[5]:
array([[ 6,  9, 18],
       [ 4,  6,  9]])

以下のコードは、2次元軸方向(縦方向)の累積和を戻しています。

In [6]:
# 2次元軸(列方向)の要素の合計値を返す
np.cumsum(a, axis=0)
Out[6]:
array([[ 6,  3,  9],
       [10,  5, 12]])
In [7]:
a.cumsum(axis=0) # メソッド
Out[7]:
array([[ 6,  3,  9],
       [10,  5, 12]])

要素に欠損値NaNが含まれる場合

要素に欠損値NaNが含まれる場合も確認してみましょう。以下の配列を使っていきます。

In [1]:
import numpy as np
a = np.array([10, 20, np.nan])
a
Out[1]:
array([10., 20., nan])

このように欠損値nanが含まれる配列の場合、np.cumsum()ndarray.cumsum()も、そのままnanとして処理します。

In [2]:
# np.cumsum()もndarray.cumsum()もnanを返す
np.cumsum(a)
Out[2]:
array([10., 30., nan])
In [3]:
a.cumsum()
Out[3]:
array([10., 30., nan])

しかし、np.nancumsum()はnanを0として処理します。

In [4]:
# np.nancumsum()はnanを0として処理する
np.nancumsum(a)
Out[4]:
array([10., 30., 30.])

これらの関数・メソッドは、他にもオプション引数dtype でデータ型を指定したり、out で出力先の配列を指定したりすることができます。より詳しくは以下で解説しています。

3. add: 2つの配列の要素ごとの和を取得

np.add()関数は、引数に渡した2つの配列(x1, x2)の要素を、要素ごとに合計して戻す関数です。これは x1 + x2 という演算と同じです。処理速度もどちらもほとんど違いはありません。しかし、np.add()関数は様々な引数でパラメータを指定することができるため操作の自由度は単純な演算よりも高いです。なお、この関数には対応するメソッドはありません。

早速、確認していきましょう。

以下の2つの配列x1とx2を例に見ていきましょう。

In [1]:
import numpy as np
rng = np.random.default_rng()
x1 = rng.integers(0, 10, (2, 3))
x1
Out[1]:
array([[4, 6, 4],
       [6, 1, 8]])
In [2]:
x2 = rng.integers(0, 10, (2, 3))
x2
Out[2]:
array([[5, 8, 6],
       [8, 8, 4]])

この2つの配列を、np.add()の引数に渡すと要素ごとに和を求めます。

In [3]:
# 2つの配列x1とx2の要素ごとの和を求める
np.add(x1, x2)
Out[3]:
array([[ 9, 14, 10],
       [14,  9, 12]])

出力結果は +演算子で算術演算した場合とまったく同じです。

In [4]:
#単純な演算と同じ
x1 + x2 
Out[4]:
array([[ 9, 14, 10],
       [14,  9, 12]])

ただし、np.add()はオプション引数 out や where、キーワード引数 axis、dtype、keepdimsなどを設定することが可能です。目的に応じて使い分けると良いでしょう。より詳しくは以下のページで解説しています。

4. まとめ

以上がNumPy配列の合計・和を求めるために用意されている関数・メソッドです。最後に一覧を掲載しておきます。

関数・メソッド名 解説 NaN
np.sum 要素の合計値を取得   優先 
ndrray.sum 同上。メソッド 優先
np.nansum 要素の合計値を取得 無視
np.cumsum 要素の累積和を取得 nan
ndarray.cumsum 同上。メソッド 同上
np.nancumsum 要素の累積和を取得 0   
np.add 2つの配列の和を取得   優先



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる