2016-03-29 28 views
11

Ho installato Anaconda 3 a 64 bit sul mio portatile e scritto il seguente codice nel Spyder:NumPy serie DTYPE è venuta come Int32 per impostazione predefinita in una finestra 10 a 64 bit macchina

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 

uscita di questi comandi mostrano il seguendo:

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') 

la mia domanda è che, anche se il mio sistema è a 64 bit, perché per default il tipo di matrice è Int32, invece di Int64?

Qualsiasi aiuto è apprezzato.

risposta

6

In Microsoft C, anche su un sistema a 64 bit, la dimensione del tipo di dati long int è di 32 bit. (Vedere, ad esempio, https://msdn.microsoft.com/en-us/library/9c3yd98k.aspx.) Numpy eredita la dimensione predefinita di un numero intero dal long int del compilatore C.

+0

La dimensione di 'int' è anch'essa a 32 bit su Linux –

+0

@SeverinPappadeux Grazie - avrei dovuto essere più esplicito sul tipo di dati C utilizzato come numero intero numerico predefinito. Ho aggiornato la mia risposta. Su un sistema Linux a 64 bit, un 'long int' è 64 bit. –

+0

c'è qualche ragione per non usare np.int64 allora? – endolith

0

Poster originale, Prana, ha fatto un'ottima domanda. "Perché il numero intero è impostato su 32-bit, su una macchina a 64-bit?"

Per quanto posso dire, la risposta breve è: "Perché è stato progettato sbagliato". Sembra ovvio, che una macchina a 64 bit debba impostare come valore predefinito - definire un numero intero in qualsiasi interprete associato come 64 bit. Ma ovviamente, le due risposte spiegano perché questo non è il caso. Le cose ora sono diverse e quindi offro questo aggiornamento.

Quello che noto è che sia per CentOS-7.4 Linux che per MacOS 10.10.5 (il nuovo e il vecchio), con Python 2.7.14 (con Numpy 1.14.0), (come a gennaio 2018), l'impostazione predefinita l'intero è ora definito a 64 bit. (Il "my_array.dtype" nell'esempio iniziale ora segnalerebbe "dtype ('int64')" su entrambe le piattaforme

L'utilizzo di numeri interi a 32 bit come numero intero predefinito in qualsiasi interprete può causare risultati molto squirrelosi se si stanno facendo numeri in virgola fissa, come a questa domanda ha sottolineato:

Using numpy to square value gives negative number

ora sembra che Python e Numpy sono stati aggiornati e rivisti (corretto, si potrebbe sostenere), in modo che al fine di replicare il problema riscontrato come descritto nella domanda precedente, devi definire esplicitamente l'array Numpy come int32

In Python, su entrambe le piattaforme ora, il numero intero predefinito sembra essere int64. Questo codice funziona allo stesso modo su entrambe le piattaforme (CentOS-7.4 e MacOSX 10.10.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]

Ma se facciamo il t_array un intero a 32 bit, si ottiene quanto segue, a causa della laminazione di calcolo integer sopra il bit del segno nella parola a 32 bit.

>>> t_array32 = np.asarray(tlist, dtype=np.int32) 
>>> t_array32.dtype 

dtype*('int32')

>>> print t_array32 ** 2 

[ 1 4 -2005153392]

La ragione per usare int32 è naturalmente, efficienza. Ci sono alcune situazioni (come l'uso di TensorFlow o altri strumenti di apprendimento automatico della rete neurale), dove si vogliono usare rappresentazioni a 32 bit (per lo più float, ovviamente), poiché i guadagni di velocità rispetto all'uso di float a 64 bit, possono essere abbastanza significativo.

+0

Numpy utilizza sempre interi a 64 bit per impostazione predefinita su Linux a 64 bit e OSX, il problema è solo Windows ':' – user7138814

+0

Grazie per l'aggiornamento. – Prana