Arrayに対する任意のReduce Operationの定義の仕方

itertools.accumulate の確認

公開日: 2023-01-21
更新日: 2023-01-26

  Table of Contents

やりたいこと

任意の正の実数 $x$ に対して,

\[\Gamma(x+1) = x\Gamma(x)\]

というガンマ関数の性質をmath.gammaを用いずに表現したい. 具体的には, index 0 の値が 1 から始まる任意の長さの等差 1 の数列を表現する arrayinput として与えられたら

1
2
def compute_cumprod(array):
    return [reduce(a * (b-1), array[:i]) for i in range(1, len(array)+1)]

と同じ結果が返ってくる関数をもっとうまい表現で書くことがゴールです.

itertools.accumulate を用いた関数定義

1
2
3
4
5
6
7
8
from itertools import accumulate

def compute_cumprod(array):
    return list(accumulate(array, lambda a, b: a*(b-1)))

x_array = np.arange(1, 6)
compute_cumprod(x_array)
>>> [1, 1, 2, 6, 24]

itertools.accumulate はどんな関数なのか?

accumulateは, 第2引数として関数を受け付け, この引数が要素を一つにまとめた値を計算する際に使われます. なお, この関数は2個の引数を受け付け, 1個の値を返すものでなければなりません.

ループ系の関数が呼び出されるような時, 状態を記憶しながら要素の反復処理をし, 更にその結果をリストとして返してくれる関数という 理解を僕はしています.

第2引数をしてしなかった場合は加算処理を返す

1
2
3
4
from itertools import accumulate
import numpy as np
print(list(accumulate(np.arange(1, 10, 2))))
>>> [1, 4, 9, 16, 25]

References

stack overflow



Share Buttons
Share on:

Feature Tags
Leave a Comment
(注意:GitHub Accountが必要となります)