2017-04-22 4 views
1

Ich habe die folgenden einfachen Codes für die Summe von zwei Vektoren.Die lange Ganzzahl bei Verwendung von NumPy

Allerdings bekomme ich falsche Ergebnisse, wenn ich NumPy verwende.

The results of the codes is as follows:

In [12]:% Lauf -I test.py

Die letzten 2 Elemente der Summe [7980015996L, 7992002000L]

Die letzten 2 Elemente der Summe [- 609918596 -597932592]

Es ist keine lange ganze Zahl, Warum?

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:] 

Antwort

0

Einfache Python-Ganzzahlen können beliebig groß werden. Numpy ganze Zahlen können nicht; Sie sind durch die Größe des Datentyps begrenzt. Wenn sie zu groß werden, werden sie sich umwickeln und negativ werden. Es sieht so aus, als wäre Ihr Array dtype wahrscheinlich int32, was zu einem Überlauf führt und zu negativen Ergebnissen führt. Sie können die korrekten Ergebnisse in diesem Fall erhalten, indem int64 mit:

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

Es ist jedoch immer noch schließlich überlaufen wird (wenn Sie size größer zu machen). Sie könnten auch float64 verwenden, die sogar größere Zahlen erlaubt, aber dann werden Sie die Präzision verlieren.

Die Kappe auf Integer-Größen ist der Preis, den Sie für die Geschwindigkeit zahlen, die numpy Ihnen gibt.

+0

Könnte auch 'dtype = object' verwenden. –

+0

@StefanPochmann: Wenn Sie das tun, gibt es keinen Grund, numpy für Ihre Berechnungen zu verwenden. – BrenBarn

+0

Sie erhalten immer noch die coole Funktionalität. So, als würde man einfach '** 3' auf dem Array oder 'a + b' von zwei Arrays verwenden. Oder Matrixmultiplikation als 'a * b' usw. In reinem Python, das mehr Code braucht, was mehr Arbeit zum Schreiben und Lesen ist. Bei NumPy geht es nicht nur um Ausführungsgeschwindigkeit. –

Verwandte Themen