総和と総積

総和と総積

sum()関数

 sum()関数は受け取ったイテラブル・オブジェクトの要素を左から右へ足し合わせて総和を返します。

 sum(イテラブル [, 最初の数字])

 たとえば、リストの要素の総和を求めることができます。

# リストA-1

num = [1, 2, 3, 4, 5]

# リストの要素をすべて加える
s = sum(num)

print(s)
15

 第 2 引数を指定すると、その引数とイテラブルの要素の総和の合計値を返します。

# リストA-2

num = [1, 2, 3, 4, 5]

# リストの要素をすべて加える
s = sum(num, 5.5)

print(s)
20.5

 引数に range()関数を渡すことで、連続した(あるいは等差で並ぶ)数字の和を求めることができます。

# リストB-1

# 1~100までの自然数の和
s1 = sum(range(1, 101))

# 1~99までの奇数の総和
s2 = sum(range(1, 100, 2))

# 2~100までの偶数の総和
s3 = sum(range(2, 101, 2))

print("1~100までの自然数の和 :", s1)
print("1~99までの奇数の和" :, s2)
print("2~100までの偶数の和 :", s3)
1~100までの自然数の和 : 5050
1~99までの奇数の和 : 2500
2~100までの偶数の和 : 2550

 

math.fsum()関数

 10 個の浮動小数点数 0.1 をリストにして、すべての要素を足してみます。

# リストD-1

num = [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]

print(sum(num))
0.9999999999999999

 実行結果は僅かに 1.0 に届きません。このような精度のロスを防ぐために math.fsum() 関数が用意されています。上と同じ計算を math.fsum() を使って実行してみます。

# リストD-2

import math

num = [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]

print(math.fsum(num))
1.0

 今度はぴたりと 1.0 となりました。
 このように、math.fsum() は浮動小数点数の正確な和を計算します。

 math.fsum(イテラブル)

 高い精度を求める場合は、math.fsum() 関数を使うようにしてください。
 

numpy.sum()関数

 numpy.sum() は配列 (ndarray) を受け取って、指定した軸に沿って総和を計算します。

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

 NumPy をインポートして、この関数の機能を確認するための配列を作っておきます。

# リストE-1

# NumPyをインポート
import numpy as np

# 3×3の2次元配列を定義
x = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

 引数に配列のみを渡すと、すべての要素の和を返します。

# リストE-2

# 配列x
# [[1, 2, 3]
#  [4, 5, 6]
#  [7, 8, 9]]

# 要素の総和を計算
s = np.sum(x)

print(s)
45

 axis に値を渡せば、任意の軸に沿って和を計算することができます。

# リストE-3

# 配列x
# [[1, 2, 3]
#  [4, 5, 6]
#  [7, 8, 9]]

# 縦軸に沿って要素の和を計算
s0 = np.sum(x, axis = 0)

# 横軸に沿って要素の和を計算
s1 = np.sum(x, axis = 1)

print("s0 =", s0)
print("s1 =", s1)
s0 = [12 15 18]
s1 = [ 6 15 24]

 実行結果を見ると、どちらの軸に沿って計算しても戻り値は 1 次元配列となっています。
 keepdims を指定すると、渡した配列の次元を保持します。

# リストE-4

# 配列x
# [[1, 2, 3]
#  [4, 5, 6]
#  [7, 8, 9]]

# 縦軸に沿って要素の和を計算(次元は保持)
s0 = np.sum(x, axis = 0, keepdims = True)

# 横軸に沿って要素の和を計算(次元は保持)
s1 = np.sum(x, axis = 1, keepdims = True)

print(s0)
print(s1)
[[12 15 18]]
 
[[ 6]
 [15]
 [24]]

 

numpy.prod()関数

 numpy.prod() は配列 (ndarray) を受け取って、指定した軸に沿って要素の総積を計算します。prod は product (積) の略です。

 numpy.prod(a, axis=None, dtype=None, out=None,
 keepdims=False)

 numpy.prod() の引数に色々な値を渡して実行結果を確認してみましょう。準備として疑似乱数を使って配列を作成します。

# リストF-1

# NumPyをインポート
import numpy as np

# 乱数シードを29に設定
np.random.seed(29)

# 疑似乱数を使って配列を作成
# [[6 4 3 9]
#  [1 2 9 6]
#  [4 2 9 2]]
x = np.random.randint(1, 10, (3, 4))

 第 1 引数だけを渡すと、すべての要素の積を返します。

# リストF-2

# 配列x
# [[6 4 3 9]
#  [1 2 9 6]
#  [4 2 9 2]]

# すべての要素の積を計算
p = np.prod(x)

print(p)
10077696

 axis に 0 を渡すと、縦軸に沿って積を計算します。

# リストF-3

# 配列x
# [[6 4 3 9]
#  [1 2 9 6]
#  [4 2 9 2]]

# 縦軸に沿って要素の積を計算
p = np.prod(x, axis = 0)

print(p)
[ 24  16 243 108]

 axis に 1 を渡すと、横軸に沿って積を計算します。

# リストF-4

# 配列x
# [[6 4 3 9]
#  [1 2 9 6]
#  [4 2 9 2]]

# 横軸に沿って要素の積を計算
p = np.prod(x, axis = 1)

print(p)
[648 108 144]

 keepdims を指定すると、渡した配列の次元を保持します。

# リストF-5

# 配列x
# [[6 4 3 9]
#  [1 2 9 6]
#  [4 2 9 2]]

# 縦軸に沿って要素の積を計算
p = np.prod(x, axis = 1, keepdims = True)

print(p)
[[648]
 [108]
 [144]]