2009-11-01 16 views
9

J'essaie de générer des valeurs entières de 64 bits aléatoires pour les entiers et les flottants en utilisant Numpy, dans toute la plage de valeurs valides pour ce type. Pour générer des flotteurs aléatoires 32 bits, je peux utiliser:Numéros aléatoires int64 et 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]) 

mais si j'essaie d'utiliser ce pour les numéros 64 bits, je reçois

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

De même, pour les entiers, je peux générer avec succès aléatoires entiers 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]) 

mais ne réussis pas pour les entiers 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 

Est-ce que ce comportement est attendu, ou devrais-je les signaler comme des bugs dans Numpy?

+1

que vous avez pu résoudre ce à la fin? – Avision

Répondre

0

Le problème semble être que la méthode random_numbers attend uniquement des entiers de 32 bits.

Selon ticket #555 graines aléatoires peuvent maintenant être 64 bits à partir de la version 1.1.0 Je suggère de télécharger et d'installer la dernière version de NumPy de here.

+0

J'utilise déjà la dernière version svn de numpy – astrofrog

+0

Quelle version est-ce que c'est? – Soviut

+0

np .__ version__ donne 1.4.0.dev7539 – astrofrog

7

Pour les entiers vous pouvez générer 2 32 bits nombres aléatoires et les combiner:

a + (b << 32) 
+0

le générateur peut être sollicité. avec des générateurs cycliques, a => b. –

+0

@ B.M. pourquoi voyez-vous cela peut être biaisé? est-il un moyen de surmonter le biais? – Avision

2

Il semblerait que le code de calcul numpy.random.uniform() fait haut-bas à un moment donné, et les tiges de là Inf.

Les entiers répartis uniformément sont faciles à générer comme cela a été montré. Les nombres à virgule flottante uniformément distribués nécessiteraient une réflexion plus approfondie. Comme pour signaler ces bizarreries en tant que bogues, je pense que vous devriez faire cela ou envoyer un message à la liste de diffusion du projet. De cette façon, vous découvrirez au moins ce que les développeurs pensent être un comportement raisonnable.

0

Je ne crois pas qu'il se réfère à l'appel de départ aléatoire. Le code le plus simple que j'ai qui tombe dans "int Python trop grand pour convertir en C long" est:

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

numpy. Version = 1.5.0 ici

0

Je sais que c'est une question très ancienne, mais il y a une nouvelle réponse 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