2009-11-01 94 views
9

我想爲整型和浮點數使用Numpy,生成隨機的64位整數值範圍內的該類型的有效值的整個範圍內。要生成隨機的32位浮點,我可以使用:隨機int64和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]) 

,但如果我試圖用這個64位數字,我收到

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

同樣,對於整數,我可以成功地生成隨機的32位整數:

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

,但我對失敗的64位整數:

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 

這是預期的行爲,還是應該將這些報告爲Numpy中的錯誤?

+1

是你能解決,在結束了嗎? – Avision 2016-05-09 13:47:06

回答

0

問題似乎是random_numbers方法只需要32位整數。

根據ticket #555從版本1.1.0開始,隨機種子現在可以是64位。我建議從here下載並安裝最新版本的NumPy。

+0

我使用的是numpy的最新svn版本 – astrofrog 2009-11-02 00:00:36

+0

它說它是哪個版本? – Soviut 2009-11-02 00:05:31

+0

np .__ version__給出1.4.0.dev7539 – astrofrog 2009-11-02 00:22:58

7

對於整數你可以生成2 32位的隨機數,並結合他們:

a + (b << 32) 
+0

發生器可以偏置。用循環生成器,a => b。 – 2016-02-11 09:13:12

+0

@ B.M。你爲什麼看到它可能有偏見?有沒有辦法克服偏見? – Avision 2016-05-09 13:46:26

2

這樣看來,對於numpy.random.uniform()代碼確實高 - 低計算在某一點,而天道酬勤從那裏莖。

均勻分佈的整數很容易產生,如圖所示。一致分佈的浮點數需要更仔細的思考。

至於報告這些古怪的錯誤,我認爲你應該做或者發佈消息到項目郵件列表。這樣你至少可以瞭解開發者認爲合理的行爲。

0

我不相信它是指隨機種子電話。落入「巨蟒INT太大,轉換爲C長的」我有最簡單的代碼是:

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

numpy的。 版本 = 1.5.0這裏

0

我意識到這是一個很古老的問題,但在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