/ /なぜnumpy.prod()が誤った否定的な結果、または自然数の長いリストに対して0を返すのですか? - Python、リスト、でこぼこ、数学

numpy.prod()が長い自然数のリストに対して負の結果を誤って返すのはなぜですか? - python、list、numpy、数学

私はちょうどProject Eulerに取り組んでいます 問題12したがって、私は500を超える固有因子の倍数である数に対してテストを行う必要があります。

その配列の積がそのような最小数であるので、私は配列[1、2、3 ... 500]が良い出発点であると考えました。ただし、numpy.prod()は ゼロ この配列の明白なものが欠けていると確信していますが、それは一体何なのでしょうか。

>>> import numpy as np
>>> array = []
>>> for i in range(1,100):
...   array.append(i)
...
>>> np.prod(array)
0
>>> array.append(501)
>>> np.prod(array)
0
>>> array.append(5320934)
>>> np.prod(array)
0

回答:

回答№1は4

ご了承ください Pythonは「無制限」の整数を使いますしかし、でこぼこしているものはすべて型付けされているので、ここでは "C"スタイル(おそらく64ビット)の整数です。あなたは「おそらくオーバーフローを経験しているのでしょう。

のドキュメントを見て numpy.prod、あなたは dtype パラメータ:

返される配列の型、および要素が乗算されるアキュムレータの型。

できることがいくつかあります。

  1. Pythonに戻り、その「無制限の整数」を使って乗算します(を参照) この質問 その方法については)。

  2. あなたが実際に見つける必要があるかどうか検討してくださいそのような膨大な数の積。非常に小さいまたは非常に大きい数の積を使って作業しているときは、多くの場合、対数の合計に切り替えます。@WarrenWeckesserが指摘するように、これは明らかに不正確です(最後に指数を付けるのとは違います)。厳密な解決策) - むしろ、ある製品が他の製品よりも急速に成長しているかどうかを判断するために使用されます。


回答№2については4

これらの数値は非常に大きくなり、早くなります。

>>> np.prod(array[:25])
7034535277573963776
>>> np.prod(array[:26])
-1569523520172457984
>>> type(_)
numpy.int64

あなたはここで "実際にはnumpy"のデータ型をオーバーフローさせているので、結果としてワックが発生します。あなたがpythonのintに固執するなら、あなたは「あふれない」ことに勝った。

>>> import operator
>>> reduce(operator.mul, array, 1)
933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000L

回答№3の場合は0

製品には多数の要因2があるため、結果0が得られます。これらの要因は450以上あります。したがって、簡約法では 2^64結果はゼロです。

データ型によってこの削減が行われる理由は、他の回答で説明されています。


250+125+62+31+15+7+3+1 = 494 is the multiplicity of 2 in 500!