NumPyには、ndarrayの全要素を足し合わせるnp.sum
関数があります。この関数を使うことで、要素全ての和を求めることや、列ごとや行ごとに和を求めることもできます。
この関数は頻繁に使われるものです。この記事を通して使い方をしっかりマスターしておきましょう。
np.sum関数
書式としてnumpy.sum
とnumpy.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
a
がndarray
であれば、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.])