NumPyには、ndarrayの全要素を足し合わせるnp.sum関数があります。この関数を使うことで、要素全ての和を求めることや、列ごとや行ごとに和を求めることもできます。

この関数は頻繁に使われるものです。この記事を通して使い方をしっかりマスターしておきましょう。

np.sum関数

書式としてnumpy.sumnumpy.ndarray.sumの2つが存在します。最初はnumpy.sumから解説していきますが、基本的な使い方は全く一緒です。

numpy.sum

まずはAPIドキュメントからみていきましょう。

np.sum(a, axis=None, dtype=None, out=None, keepdims=None)

params:

パラメータ名 概要
a 配列に相当するオブジェクト 和を求めたい配列を指定します。
axis Noneまたはint
またはintのタプル
(省略可能)初期値None
どの軸方向に要素を足し合わせていくかを指定します。Noneの時は全ての要素を足し合わせます。
dtype データ型 出力する値のデータ型と、計算を行う際に用いるデータ型を指定します。
out ndarray (省略可能)初期値None
結果を代入するための配列を指定します。
keepdims bool値 (省略可能)初期値False
入力された配列の次元と出力する配列の次元を合わせるかどうかを指定します。次元を合わせておくとブロードキャストを適用させる際に便利です。
initial scalar (省略可能)初期値no value。
合計の開始値
where array_like of bool (省略可能)初期値no value。合計に含める要素

returns:

和を要素とする配列を返します。

引数としては返す値のdtypeと計算する軸方向を指定するaxisの2つが引数の主なものになってきます。和を一旦出した後、元の配列に対してその和を使って処理をほどこしたい場合はブロードキャストが適用できるようにkeepdims=Trueにしておきます。keepdimsは要素が1となった次元でも削除したりせずにそのまま保持しておくように指定できる引数です。

axisの使い方については以下の記事を参考にしてみてください。

NumPyの軸(axis)と次元数(ndim)とは何を意味するのか - DeepAge /features/numpy-axis.html

axisを指定すると、指定した軸(axis)の方向に和を出すよう計算させることができます。引数outに関しては滅多に使われることがないため説明は割愛します。

numpy.ndarray.sum

andarrayであれば、a.sumの形で使われる関数です(厳密にはaの属性となりますが)。 a以外の他の引数は全く一緒となります。

サンプルコード

実際のコードを通して使い方を覚えていきましょう。

numpy.sum

まずは全ての要素を足し合わせます。

In [1]: import numpy as np # numpyモジュールのインポート

In [2]: a = np.random.randint(0, 10, size=(2,5))

In [3]: a # 2×5の0~9における乱数配列。
Out[3]:
array([[4, 6, 8, 3, 3],
       [9, 4, 6, 5, 4]])

In [4]: np.sum(a) # 全ての要素の和を求める。
Out[4]: 52

In [5]: b = np.array([2, 4, 1, 6]) # 1次元配列でももちろんできる。

In [6]: np.sum(b)
Out[6]: 13

In [7]: c = np.random.randint(0, 10, size=(2, 4, 5)) # 3次元配列でも試してみる

In [8]: c
Out[8]:
array([[[5, 0, 9, 8, 4],
        [6, 2, 8, 5, 3],
        [9, 7, 4, 8, 6],
        [2, 4, 2, 0, 7]],

       [[1, 4, 4, 3, 3],
        [8, 6, 6, 2, 7],
        [0, 0, 2, 4, 7],
        [5, 0, 2, 7, 9]]])

In [9]: np.sum(c)
Out[9]: 179

次に、引数axisを指定します。axisを指定することで、2次元以上の配列のとき特定の次元方向に要素を足し合わせていくことができます。

In [10]: a # 先ほどと同じ2次元配列を用いる
Out[10]:
array([[4, 6, 8, 3, 3],
       [9, 4, 6, 5, 4]])

In [11]: np.sum(a, axis=0) # 行方向に足し合わせる
Out[11]: array([13, 10, 14,  8,  7])

In [12]: np.sum(a, axis=1) # 列方向に足し合わせる
Out[12]: array([24, 28])

In [13]: c # 3次元
Out[13]:
array([[[5, 0, 9, 8, 4],
        [6, 2, 8, 5, 3],
        [9, 7, 4, 8, 6],
        [2, 4, 2, 0, 7]],

       [[1, 4, 4, 3, 3],
        [8, 6, 6, 2, 7],
        [0, 0, 2, 4, 7],
        [5, 0, 2, 7, 9]]])

In [14]: np.sum(c, axis=0)
Out[14]:
array([[ 6,  4, 13, 11,  7],
       [14,  8, 14,  7, 10],
       [ 9,  7,  6, 12, 13],
       [ 7,  4,  4,  7, 16]])

In [15]: np.sum(c, axis=1)
Out[15]:
array([[22, 13, 23, 21, 20],
       [14, 10, 14, 16, 26]])

In [16]: np.sum(c, axis=2)
Out[16]:
array([[26, 24, 34, 15],
       [15, 29, 13, 23]])

axisを指定した状態でkeepdims=Trueにすると次元が保存され、3次元配列の和であれば3次元配列が出力されます。

In [17]: np.sum(c, axis=0, keepdims=True) # keepdims=Trueにすると3次元配列が出力される
Out[17]:
array([[[ 6,  4, 13, 11,  7],
        [14,  8, 14,  7, 10],
        [ 9,  7,  6, 12, 13],
        [ 7,  4,  4,  7, 16]]])

In [18]: np.sum(c, axis=1, keepdims=True)
Out[18]:
array([[[22, 13, 23, 21, 20]],

       [[14, 10, 14, 16, 26]]])

In [19]: np.sum(c, axis=2, keepdims=True)
Out[19]:
array([[[26],
        [24],
        [34],
        [15]],

       [[15],
        [29],
        [13],
        [23]]])

次にdtypeを指定します。

In [20]: np.sum(a, dtype='int8') # データ型をint8にする。
Out[20]: 52

In [21]: np.sum(a, axis=0, dtype='float') # floatにする。
Out[21]: array([ 13.,  10.,  14.,   8.,   7.])

numpy.ndarray.sum

こちらでも同じことをしていきます。

In [22]: a # 先ほどと同じ配列を使い回す。s
Out[22]:
array([[4, 6, 8, 3, 3],
       [9, 4, 6, 5, 4]])

In [23]: b
Out[23]: array([2, 4, 1, 6])

In [24]: c
Out[24]:
array([[[5, 0, 9, 8, 4],
        [6, 2, 8, 5, 3],
        [9, 7, 4, 8, 6],
        [2, 4, 2, 0, 7]],

       [[1, 4, 4, 3, 3],
        [8, 6, 6, 2, 7],
        [0, 0, 2, 4, 7],
        [5, 0, 2, 7, 9]]])

In [25]: a.sum() # まずは単純な和から
Out[25]: 52

In [26]: b.sum()
Out[26]: 13

In [27]: c.sum()
Out[27]: 179

In [28]: a.sum(axis=0) # axisを指定する
Out[28]: array([13, 10, 14,  8,  7])

In [29]: c.sum(axis=0)
Out[29]:
array([[ 6,  4, 13, 11,  7],
       [14,  8, 14,  7, 10],
       [ 9,  7,  6, 12, 13],
       [ 7,  4,  4,  7, 16]])

In [30]: c.sum(axis=2)
Out[30]:
array([[26, 24, 34, 15],
       [15, 29, 13, 23]])

In [31]: a.sum(axis=0, keepdims=True) # keepdims=Trueにする
Out[31]: array([[13, 10, 14,  8,  7]])

In [32]: c.sum(axis=2, keepdims=True)
Out[32]:
array([[[26],
        [24],
        [34],
        [15]],

       [[15],
        [29],
        [13],
        [23]]])

In [33]: a.sum(axis=0, dtype='float') # dtypeを指定する
Out[33]: array([ 13.,  10.,  14.,   8.,   7.])

参考