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
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
@ user2357112 Ich benutze Python 2.7.11 und Numpy 1.11.0 – mxmlnkn