『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

総和と総積

総和を計算する関数

sum()

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

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

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

# PYTHON_SUM

# In[1]

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

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

print(s)
# 15

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

# In[2]

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

print(s)
# 20.5

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

# In[3]

# 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までの自然数の和:{}".format(s1))
print("1~99までの奇数の和":{}.format(s2))
print("2~100までの偶数の和:{}".format(s3))

# 1~100までの自然数の和:5050
# 1~99までの奇数の和:2500
# 2~100までの偶数の和:2550

math.fsum()

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

# PYTHON_MATH_FSUM

# In[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() を使って実行してみます。

# In[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 をインポートして、この関数の機能を確認するための配列を作っておきます。

# NUMPY_SUM

# In[1]

import numpy as np

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

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

# In[2]

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

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

print(s)
# 45

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

# In[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 = {}".format(s0))
print("s1 = {}".format(s1))

# s0 = [12 15 18]
# s1 = [ 6 15 24]

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

# In[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() の引数に色々な値を渡して実行結果を確認してみましょう。準備として疑似乱数を使って配列を作成します。

# NUMPY_PROD

# In[1]

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引数だけを渡すと、すべての要素の積を返します。

# In[2]

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

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

print(p)
# 10077696

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

# In[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 を渡すと、横軸に沿って積を計算します。

# In[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 を指定すると、渡した配列の次元を保持します。

# In[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]]

コメント