Original-Plakat, Prana, stellte eine sehr gute Frage. "Warum ist die Integer-Standardeinstellung auf einer 64-Bit-Maschine auf 32-Bit gesetzt?"
So nah wie ich sagen kann, ist die kurze Antwort: "Weil es falsch entworfen wurde". Offensichtlich sollte eine 64-Bit-Maschine standardmäßig eine ganze Zahl in einem zugehörigen Interpreter als 64-Bit definieren. Aber natürlich erklären die beiden Antworten, warum das nicht der Fall ist. Die Dinge sind jetzt anders und so biete ich dieses Update an.
Was ich bemerke ist, dass für CentOS-7.4 Linux und MacOS 10.10.5 (das neue und das alte), Python 2.7.14 (mit Numpy 1.14.0), (Stand Januar 2018), der Standard Ganzzahl ist jetzt als 64-Bit definiert. (Der "my_array.dtype" im ersten Beispiel würde jetzt "dtype ('int64')" auf beiden Plattformen melden.
Die Verwendung von 32-Bit-Ganzzahlen als Standard-Ganzzahl in einem Interpreter kann zu sehr skurrilen Ergebnissen führen, wenn Sie integer math tun, als diese Frage wies darauf hin:
Using numpy to square value gives negative number
Es scheint nun, dass Python und Numpy wurden aktualisiert und überarbeitet (korrigiert, könnte man argumentieren), so dass, um das Problem zu replizieren auftreten als Wie in der obigen Frage beschrieben, müssen Sie das Numpy-Array explizit als int32 definieren:
In Python wird jetzt standardmäßig auf beiden Plattformen int64 angezeigt. Dieser Code läuft auf beiden Plattformen (CentOS-7.4 und MacOSX 10.10) gleich.5):
>>> import numpy as np
>>> tlist = [1, 2, 47852]
>>> t_array = np.asarray(tlist)
>>> t_array.dtype
dtype('int64')
>>> print t_array ** 2
[ 1 4 2289813904]
Aber wenn wir die t_array einen 32-Bit-Integer machen, so erhält man die folgende, wegen der ganzen Zahl Berechnung Rollen über das Vorzeichenbit in dem 32-Bit-Wort.
>>> t_array32 = np.asarray(tlist, dtype=np.int32)
>>> t_array32.dtype
dtype*('int32')
>>> print t_array32 ** 2
[ 1 4 -2005153392]
Der Grund für int32 verwendet, ist natürlich Effizienz. Es gibt einige Situationen (z. B. die Verwendung von TensorFlow oder anderen Lernwerkzeugen für neuronale Netzwerke), bei denen Sie 32-Bit-Darstellungen (hauptsächlich float) verwenden möchten, da die Geschwindigkeit im Vergleich zur Verwendung von 64-Bit-Gleitkommazahlen recht hoch sein kann von Bedeutung.
Die Größe von 'int' ist 32bit auch unter Linux –
@SeverinPappadeux Danke - Ich hätte expliziter über den C-Datentyp sein sollen, der als die standardmäßige numpige Ganzzahl verwendet wird. Ich habe meine Antwort aktualisiert. Auf einem 64-Bit-Linux-System ist ein 'long int' 64 Bit. –
Gibt es einen Grund, np.int64 nicht zu verwenden? – endolith