1

zs がnumpy配列で、Rが定数である単純な二次関数をマップしようとしています

Ns = -np.square(zs) + 2*zs*R+ 3*R**2

ほとんどの場合は問題なく動作しますが、何らかの理由で、コードブレークに従って評価を設定するたびに:

>>>zs = np.array(range(80262,80268)
>>>R = 26756
>>>Ns = -np.square(zs) + 2*zs*R+ 3*R**2
>>>print Ns
array([    642108,    535095,    428080,    321063,    214044
       4295074319], dtype=int64)

配列の最後の値は 107023 である必要があります。80267 を超えると、2 乗関数が完全に機能しなくなり、ばかげた答えが返ってきます。これは単なるデータ型エラーですか、それとも私が知らない何かがここで起こっていますか?

4

1 に答える 1

5

問題は、値zs = np.array(range(80262,80268))の配列を作成することint32です。

np.square(zs)と同じデータ型の配列を返し、配列のzs最終的な 2 乗値は、割り当てられた 4 バイトのメモリをオーバーフローします。

より大きな数に対応するために、NumPy がこの配列により多くのメモリを与えたためNs = -np.square(zs) + 2*zs*R+ 3*R**2、 のデータ型があることがわかります。int64しかし、それでは遅すぎます: には既にオーバーフローした値がありnp.square(zs)ます。

この問題を解決するには、次のデータ型zsを使用して作成します。np.int64

zs = np.arange(80262, 80268, dtype=np.int64)

zsの数が十分に大きくなると、同じ問題が再び発生することに注意してください。

于 2014-11-25T14:41:51.500 に答える