2017-04-22 1 views
1

2つのベクトルの合計に対して次の簡単なコードがあります。NumPyを使用する場合の長整数

しかし、NumPyを使用すると、私は間違った結果になります。

[12]において

The results of the codes is as follows:

:%ラン-i test.py

和の最後の2つの要素[7980015996L、7992002000L]

和[最後の2つの要素 - 609918596 -597932592]

これは長い整数ではありません、なぜですか?

import numpy as np 
def numpysum(n): 
    a = np.arange(n) ** 2 
    b = np.arange(n) ** 3 
    c = a + b 

    return c 

def pythonsum(n): 
    a = range(n) 
    b = range(n) 
    c = [] 

    for i in range(len(a)): 
     a[i] = i ** 2 
     b[i] = i ** 3 
     c.append(a[i] + b[i]) 

    return c 

size = 2000 

c = pythonsum(size) 
print "The last 2 elements of the sum", c[-2:] 
c = numpysum(size) 
print "The last 2 elements of the sum", c[-2:] 

答えて

0

プレーンPythonの整数は任意に大きくなります。ナンシー整数はできません。それらはデータ型のサイズによって制限されます。彼らが大きすぎる場合、彼らは包み込み、負になります。あなたの配列dtypeがおそらくint32でオーバーフローし、結果が否定的になるようです。あなたはint64型を使用して、この場合、正しい結果を得ることができます。

a = np.arange(n, dtype=np.int64) ** 2 
b = np.arange(n, dtype=np.int64) ** 3 

(あなたはsizeを大きくする場合)しかし、それはまだ最終的にオーバーフローします。 float64を使用することもできます。これにより、さらに大きな数値が可能になりますが、精度が低下します。

整数サイズの上限は、あなたが支払う速度の対価です。

+0

'dtype = object'を使用することもできます。 –

+0

@StefanPochmann:これを行うと、計算にnumpyを使用する理由はあまりありません。 – BrenBarn

+0

あなたはまだすべてのクールな機能を得る。単に配列の '' 3''や2つの配列の 'a + b'を使うのと同じです。または行列の乗算を 'a * b'などとする。より多くのコードを必要とする純粋なPythonでは、書き込みと読み込みの作業が多くなります。 NumPyは実行速度だけではありません。 –

関連する問題