Pythonのsum()
関数は、イテラブル内の数値の合計を返します。
sum([3,4,5]) == 3 + 4 + 5 == 12
代わりに製品を返す関数を探しています。
somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60
そのような関数が存在することは確かですが、見つかりません。
Pythonのsum()
関数は、イテラブル内の数値の合計を返します。
sum([3,4,5]) == 3 + 4 + 5 == 12
代わりに製品を返す関数を探しています。
somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60
そのような関数が存在することは確かですが、見つかりません。
回答:
Python 3.8では、数学モジュールにprod関数が追加されました。参照:math.prod()。
探している関数はprod()またはproduct()と呼ばれますが、Pythonにはその関数がありません。だから、あなたは自分で書く必要があります(簡単です)。
はい、そうです。Guido は、組み込みのprod()関数の必要性はほとんどないと考えたため、そのアイデアを拒否しました。
あなたが示唆したように、reduce()とoperator.mul()を使用して独自に作成することは難しくありません:
from functools import reduce # Required in Python 3
def prod(iterable):
return reduce(operator.mul, iterable, 1)
>>> prod(range(1, 5))
24
Python 3では、reduce()関数はfunctoolsモジュールに移動されました。
補足として、prod()の動機となる主なユースケースは、階乗の計算です。mathモジュールですでにサポートされています:
>>> import math
>>> math.factorial(10)
3628800
データが浮動小数点で構成されている場合は、sum()を使用して指数と対数で積を計算できます。
>>> from math import log, exp
>>> data = [1.2, 1.5, 2.5, 0.9, 14.2, 3.8]
>>> exp(sum(map(log, data)))
218.53799999999993
>>> 1.2 * 1.5 * 2.5 * 0.9 * 14.2 * 3.8
218.53799999999998
log()を使用するには、すべての入力が正である必要があることに注意してください。
実際、Guidoはこのアイデアに拒否権を行使しました:http : //bugs.python.org/issue1093
しかし、その問題で述べたように、かなり簡単に作成できます。
from functools import reduce # Valid in Python 2.6+, required in Python 3
import operator
reduce(operator.mul, (3, 4, 5), 1)
reduce
ですか?
product()
標準ライブラリに含めることを請願したい場合は、この質問に対する意見の数が訴訟を起こすのに役立つかもしれません。
組み込みのものはありませんが、ここで示すように、自分でロールするのは簡単です。
import operator
def prod(factors):
return reduce(operator.mul, factors, 1)
この質問への回答を見る:
functools.reduce
代わりにを使用してくださいreduce
。
prod = functools.partial(functools.reduce, operator.mul)
ありますprod()
、あなたが求めているものを行いnumpyの中で。
np.prod(range(1,13))
、正解は12になります。しかしnp.prod(range(1,14))
しません。
np.prod(arange(1,14, dtype='object'))
?
math.prod()
この関数は、この答えは陳腐化します。
Numeric.product
(または
reduce(lambda x,y:x*y,[3,4,5])
)
これを使って
def prod(iterable):
p = 1
for n in iterable:
p *= n
return p
ビルトインがないので prod
関数が。
lambda a,b: a*b
しても問題ありません。しかし、reduceは一般化されず、乱用されます。初心者は覚えない方がいいです。
私は答えを好むとB使用して、上記functools.reduce()と答え使用してnumpy.prodを()が、ここではまだ使用して、別の解決策であるitertools.accumulateを() :
import itertools
import operator
prod = list(itertools.accumulate((3, 4, 5), operator.mul))[-1]