2017-04-22 93 views
1

我有兩個向量之和的以下簡單代碼。使用NumPy時的長整數

但是,當我使用NumPy時,我得到了錯誤的結果。

The results of the codes is as follows:

在[12]:%運行-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整數可以增長到任意大。 Numpy整數不能;它們受限於數據類型的大小。如果他們變得太大,他們會環繞並變得消極。它看起來像你的數組dtype可能是int32,它溢出並導致負面結果。您可以通過使用得到的Int64在這種情況下,正確的結果:

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

但是,它仍然會溢出,最終(如果你讓size大)。你也可以使用float64,它允許更大的數字,但是你會失去精確度。

整數大小上限是您支付速度numpy給您的價格。

+0

也可以使用'dtype = object'。 –

+0

@StefanPochmann:如果你這樣做,沒有太多的理由使用numpy進行計算。 – BrenBarn

+0

你仍然可以獲得所有酷炫的功能。就像在數組上使用'** 3'或者在兩個數組上使用'a + b'一樣。或矩陣乘法爲'a * b'等。在純Python中,需要更多的代碼,這是更多的工作來寫和讀。 NumPy不僅僅是執行速度。 –