2009-11-01 15 views
9

Sto provando a generare valori interi a 64 bit casuali per numeri interi e float utilizzando Numpy, nell'intero intervallo di valori validi per quel tipo. Per generare casuali carri a 32 bit, è possibile utilizzare:Numeri int64 e float64 casuali

In [2]: np.random.uniform(low=np.finfo(np.float32).min,high=np.finfo(np.float32).max,size=10) 
Out[2]: 
array([ 1.47351436e+37, 9.93620693e+37, 2.22893053e+38, 
     -3.33828977e+38, 1.08247781e+37, -8.37481260e+37, 
     2.64176554e+38, -2.72207226e+37, 2.54790459e+38, 
     -2.47883866e+38]) 

ma se provo e uso questo per i numeri a 64 bit, ottengo

In [3]: np.random.uniform(low=np.finfo(np.float64).min,high=np.finfo(np.float64).max,size=10) 
Out[3]: array([ Inf, Inf, Inf, Inf, Inf, Inf, Inf, Inf, Inf, Inf]) 

Allo stesso modo, per gli interi, è possibile generare con successo casuali interi a 32 bit:

In [4]: np.random.random_integers(np.iinfo(np.int32).min,high=np.iinfo(np.int32).max,size=10) 
Out[4]: 
array([-1506183689, 662982379, -1616890435, -1519456789, 1489753527, 
     -604311122, 2034533014, 449680073, -444302414, -1924170329]) 

, ma sono senza successo per interi a 64 bit:

In [5]: np.random.random_integers(np.iinfo(np.int64).min,high=np.iinfo(np.int64).max,size=10) 
--------------------------------------------------------------------------- 
OverflowError        Traceback (most recent call last) 

/Users/tom/tmp/<ipython console> in <module>() 

/Library/Python/2.6/site-packages/numpy/random/mtrand.so in mtrand.RandomState.random_integers (numpy/random/mtrand/mtrand.c:6640)() 

/Library/Python/2.6/site-packages/numpy/random/mtrand.so in mtrand.RandomState.randint (numpy/random/mtrand/mtrand.c:5813)() 

OverflowError: long int too large to convert to int 

È questo comportamento previsto o dovrei segnalarlo come bug in Numpy?

+1

sono stati in grado di risolvere che alla fine? – Avision

risposta

0

Il problema sembra essere che il metodo random_numbers prevede solo numeri interi a 32 bit.

Secondo ticket #555 i semi casuali ora possono essere a 64 bit a partire dalla versione 1.1.0 Suggerisco di scaricare e installare l'ultima versione di NumPy da here.

+0

Sto usando l'ultima versione svn di numpy già – astrofrog

+0

Quale versione dice? – Soviut

+0

np .__ version__ restituisce 1.4.0.dev7539 – astrofrog

7

Per gli interi si potrebbe generare 2 a 32 bit numeri casuali e combinarli:

a + (b << 32) 
+0

il generatore può essere biascicato. con generatori ciclici, a => b. –

+0

@ B.M. perché vedi che può essere di parte? c'è un modo per superare il pregiudizio? – Avision

2

Sembrerebbe che il codice per numpy.random.uniform() fa il calcolo alto-basso ad un certo punto, e l'Inf nasce da lì.

Gli interi distribuiti uniformemente sono facili da generare come è stato mostrato. I numeri in virgola mobile distribuiti uniformemente richiederebbero un pensiero più attento.

Per quanto riguarda la segnalazione di queste stranezze come bug, penso che dovresti fare quello o inviare un messaggio alla mailing list del progetto. In questo modo scoprirai almeno che cosa pensano gli sviluppatori è un comportamento ragionevole.

0

Non credo che si riferisca alla chiamata seme casuale. Il codice più semplice che ho che rientra in "Python int troppo grande per convertire in C lungo" è:

x = numpy.random.random_integers(2**64,size=(SIZE,)).astype(numpy.uint64) 

NumPy. versione = 1.5.0 qui

0

Mi rendo conto che questa è una domanda molto vecchio, ma c'è una nuova risposta in Python 3.6.3:

Python 3.6.3 |Anaconda, Inc.| (default, Oct 6 2017, 12:04:38) 
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import numpy as np 
>>> import sys 
>>> sys.maxsize 
9223372036854775807 
>>> np.random.randint(sys.maxsize) 
8550528944245072046