2009-11-01 4 views
9

Я пытаюсь создать случайные 64-разрядные целочисленные значения для целых чисел и чисел с плавающей точкой, используя Numpy, во всем диапазоне допустимых значений для этого типа. Для генерации случайных 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

ответ

0

Проблема заключается в том, что метод random_numbers ожидает только 32-разрядных целых чисел.

Согласно ticket #555 случайные семена теперь могут быть 64-битными с версии 1.1.0. Я предлагаю загрузить и установить последнюю версию NumPy с here.

+0

Я использую последнюю версию svn numpy уже – astrofrog

+0

Какая версия это говорит? – Soviut

+0

np .__ version__ дает 1.4.0.dev7539 – astrofrog

7

Для целых чисел вы можете создать 2 32 бит случайных чисел и комбинировать их:

a + (b << 32) 
+0

генератор может быть биаизирован. с циклическими образующими, a => b. –

+0

@ B.M. почему вы видите, что это может быть предвзятым? есть ли способ преодолеть предвзятость? – Avision

2

Казалось бы, что код numpy.random.uniform() делает хай-лоу расчет в какой-то момент, и Inf стебли оттуда.

Равномерно распределенные целые числа легко сгенерировать, как было показано. Равномерно распределенные числа с плавающей запятой требуют более тщательной мысли.

Что касается сообщения об этих странностях как об ошибках, я думаю, вы должны сделать это или опубликовать сообщение в списке рассылки проекта. Таким образом, вы, по крайней мере, узнаете, что думают разработчики, разумное поведение.

0

Я не верю, что это относится к случайному посекундному звонку. Самый простой код, который я получил, что попадает в «Python междунар слишком большой, чтобы преобразовать 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 
Смежные вопросы