Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Random int64 and float64 numbers

I'm trying to generate random 64-bit integer values for integers and floats using Numpy, within the entire range of valid values for that type. To generate random 32-bit floats, I can use:

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

but if I try and use this for 64-bit numbers, I get

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

Similarly, for integers, I can successfully generate random 32-bit integers:

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

but am unsuccessful for 64-bit integers:

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

Is this expected behavior, or should I report these as bugs in Numpy?

like image 698
astrofrog Avatar asked Nov 01 '09 23:11

astrofrog


3 Answers

For integers you could generate 2 32 bit random numbers and combine them:

a + (b << 32)
like image 86
rjmunro Avatar answered Oct 19 '22 11:10

rjmunro


It would appear that the code for numpy.random.uniform() does high-low calculation at some point, and the Inf stems from there.

Uniformly distributed integers are easy to generate as was shown. Uniformly distributed floating point numbers would require rather more careful thought.

As for reporting these oddities as bugs, I think you should do either that or post a message to the project mailing list. That way you'll at least find out what the developers think is reasonable behaviour.

like image 41
Tuure Laurinolli Avatar answered Oct 19 '22 11:10

Tuure Laurinolli


I don't believe it refers to the random seed call. The simplest code I've got that falls into "Python int too large to convert to C long" is:

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

numpy.version=1.5.0 here

like image 1
linhares Avatar answered Oct 19 '22 10:10

linhares