2016-05-02 4 views
1

float ich wollte eine einfache ganzzahlige Division z. 1/3=0, aber uint64 verhält sich sehr seltsam, was dazu führt, dass mein Ergebnis zu floaten ist. Warum?Python numpy uint64 wird konvertiert, um auf Division

python> uint64(100)/3 
Out[0]: 33.333333333333336 
python> uint64(100)/uint64(3) 
Out[1]: 33 
python> int64(100)/3 
Out[2]: 33 
python> int64(100)/uint64(3) 
Out[3]: 33.333333333333336 
python> int32(100)/int64(3) 
Out[4]: 33 

Antwort

1

Das ist, weil Python einen signierten und einen Typen ohne Vorzeichen sieht und versucht, automatisch den Ergebnistyp ableiten, die unterzeichnet werden. Aber da die erste 64-Bit-Nummer nicht signiert war, würde die signierte Version 65-Bit benötigen. Da es in Python/Numpy keinen Integer-Typ gibt, der höher als 64 Bit ist, wählt Python float64. Der Standardtyp, d. H. Für den Divisor 3 ist int64, deshalb wird das erste Beispiel in float64 umgewandelt. Dies funktioniert auch mit multplications natürlich:

python> type(int64(10)*int64(1)) 
Out[0]: numpy.int64 
python> type(uint64(10)*uint64(1)) 
Out[1]: numpy.uint64 
python> type(uint64(10)*int64(1)) 
Out[2]: numpy.int64 

Beachten Sie, dass diese automatische Typ Abzug nur auf verschiedene Arten unterzeichnet gilt, weil es Wert Agnostiker ist, sonst fast alle Typen wie float64 müssen enden würde, weil z.B. nach drei aufeinanderfolgenden Multiplikationen könnte es möglich sein, dass es nicht mehr in uint64 passt.

type(uint64(12345678900)*uint64(12345678900)) 
/usr/bin/ipython:1: RuntimeWarning: overflow encountered in ulong_scalars 
#! /usr/bin/python 
Out[3]: numpy.uint64 
+0

Huh. Ich habe ein verwandtes Problem mit den bitweisen Operatoren gesehen, aber da ist nur ein TypeError, weil NumPy Fließkomma-Ergebnistypen nicht als Option betrachtet. Ich dachte nicht, dass sie für nicht-bitweise Operationen eine Fließkommaausgabe verwenden würden. Unter 1.8.1 erhalte ich einen Fließkommaausgang für diese Multiplikation gemischter Signedness; In welcher NumPy Version bist du? – user2357112

+0

@ user2357112 Ich benutze Python 2.7.11 und Numpy 1.11.0 – mxmlnkn