2009-11-01 16 views
9

Bu tür için tüm geçerli değerler aralığında Numpy, kullanarak tamsayılar ve yüzdelikler için rasgele 64 bit tamsayı değerleri oluşturmaya çalışıyorum. rastgele 32 bit yüzen oluşturmak için, ben kullanabilirsiniz:Rastgele int64 ve float64 sayıları

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

ama denemek ve 64-bit numaraları için kullanabilir, ben Benzer

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

olsun, tamsayılar için, başarıyla üretebilir rastgele 32 bit tamsayı:

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

ancak 64 bit tamsayı için başarısız olduğumu:

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 

Bu beklenen davranış budur veya bunları Numpy içinde böcek olarak bildirmeliyim?

+1

Eğer sonunda o çözmek başardık? – Avision

cevap

0

Sorun, random_numbers yönteminin yalnızca 32 bitlik tamsayılar beklemesi gibi görünüyor.

ticket #555'a göre rastgele tohumlar artık 1.1.1 sürümünden 64 bit olabilirler. Bu nedenle, here'dan NumPy'nin en son sürümünü indirip yüklemeyi öneririm.

+0

Zaten numpy'nin en son svn sürümünü kullanıyorum – astrofrog

+0

Hangi versiyon öyle diyor? – Soviut

+0

np .__ version__ 1.4.0.dev7539 verir – astrofrog

7

tamsayılar için, 2 32 bitlik rastgele sayılar oluşturmak ve bunları birleştirmek olabilir:

a + (b << 32) 
+0

Jeneratör biaised edilebilir. döngüsel jeneratörler ile, a => b. –

+0

@ B.M. Neden yanlı olabileceğini görüyor musunuz? Önyargıyı aşmanın bir yolu var mı? – Avision

2

O numpy.random.uniform() için kod bir noktada yüksek-düşük hesaplama yapar görünür ve Enf oradan kaynaklanıyor.

Eşit dağılımlı tam sayıların gösterildiği gibi üretilmesi kolaydır. Düzgün olarak dağılmış kayan nokta sayıları daha dikkatli düşünmeyi gerektirir.

Bu tuhaflıkları hata olarak bildirirken, bence ya da proje posta listesine bir mesaj yazmanız gerektiğini düşünüyorum. Bu şekilde, geliştiricilerin düşündüklerini en azından mantıklı bir davranış olarak göreceksiniz.

0

Rastgele tohum çağrısına başvurduğuna inanmıyorum. "Uzun C'ye dönüştürmek için çok büyük Python int" düşer bende en basit kodudur:

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

numpy. sürümü = 1.5.0 burada

0

Bu çok eski bir sorudur farkındayım ama Python 3.6.3 yeni cevap var:

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