2016-03-29 7 views
11

I Anaconda 3 64 Bit auf meinem Laptop installiert haben und den folgenden Code in Spyder geschrieben:numpy Array dtype kommt als int32 standardmäßig in einem Windows 10 64-Bit-Maschine

import numpy.distutils.system_info as sysinfo 
import numpy as np 
import platform 

sysinfo.platform_bits 
platform.architecture() 

my_array = np.array([0,1,2,3]) 
my_array.dtype 

Ausgabe dieser Befehle zeigen die folgende:

sysinfo.platform_bits 
Out[31]: 64 

platform.architecture() 
Out[32]: ('64bit', 'WindowsPE') 

my_array = np.array([0,1,2,3]) 
my_array.dtype 
Out[33]: dtype('int32') 

Meine Frage ist, dass, obwohl mein System 64bit ist, warum standardmäßig der Array-Typ anstelle von int64 int32 ist?

Jede Hilfe wird geschätzt.

Antwort

6

In Microsoft C, selbst auf einem 64-Bit-System, ist die Größe des long int Datentyps 32 Bit. (Siehe beispielsweise https://msdn.microsoft.com/en-us/library/9c3yd98k.aspx.) Numpy erbt die Standardgröße einer Ganzzahl aus dem C-Compiler long int.

+0

Die Größe von 'int' ist 32bit auch unter Linux –

+0

@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. –

+0

Gibt es einen Grund, np.int64 nicht zu verwenden? – endolith

0

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.

+0

Numpy verwendet immer 64-Bit-Ganzzahlen standardmäßig auf 64-Bit-Linux und OSX, das Problem ist nur Windows ':)' – user7138814

+0

Danke für das Update. – Prana