2009-11-01 9 views
9

Estoy intentando generar valores enteros aleatorios de 64 bits para enteros y flotantes usando Numpy, dentro de todo el rango de valores válidos para ese tipo. Para generar al azar flota de 32 bits, puedo usar:Números aleatorios int64 y float64

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

pero si lo intento y lo uso para un número de 64 bits, me sale

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

Del mismo modo, para los enteros, puedo generar con éxito aleatorios enteros de 32 bits:

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

, pero estoy infructuosa de enteros de 64 bits:

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 

¿Es este comportamiento esperado, o debo informarlo como errores en Numpy?

+1

que eran capaces de resolver que al final? – Avision

Respuesta

0

El problema parece ser que el método random_numbers solo espera enteros de 32 bits.

De acuerdo con ticket #555 semillas aleatorias ahora puede ser de 64 bits desde la versión 1.1.0 Sugiero descargar e instalar la última versión de NumPy de here.

+0

Estoy usando la última versión svn de numpy ya – astrofrog

+0

¿Qué versión dice que es? – Soviut

+0

np .__ version__ da 1.4.0.dev7539 – astrofrog

7

Para enteros que podría generar números aleatorios 2 32 bits y combinarlos:

a + (b << 32) 
+0

el generador puede ser biaised. con generadores cíclicos, a => b. –

+0

@ B.M. ¿Por qué ves que puede ser parcial? ¿Hay alguna manera de superar el sesgo? – Avision

2

parecería que el código para numpy.random.uniform() hace el cálculo de máximos y mínimos en algún momento, y la Inf proviene de allí.

Los enteros uniformemente distribuidos son fáciles de generar como se muestra. Los números de punto flotante distribuidos uniformemente requerirían un pensamiento bastante más cuidadoso.

En cuanto a informar estas rarezas como errores, creo que deberías hacer eso o enviar un mensaje a la lista de correo del proyecto. De esa forma, al menos descubrirá lo que los desarrolladores creen que es un comportamiento razonable.

0

No creo que se refiera a la llamada inicial aleatoria. El código más simple Tengo que cae en "int Python demasiado grande para convertir a C larga" es:

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

numpy. versión 1.5.0 = aquí

0

Comprendo que esto es una pregunta muy antigua, pero hay una nueva respuesta en 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