2009-11-01 11 views
9

Próbuję generować losowe 64-bitowe liczby całkowite dla liczb całkowitych i zmiennych za pomocą Numpy, w całym zakresie prawidłowych wartości dla tego typu. Do generowania losowych 32-bitowych pływaków, mogę użyć:Losowe numery int64 i 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]) 

ale gdybym spróbować to wykorzystać dla liczb 64-bitowych, mam

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

Podobnie, dla liczb całkowitych, mogę z powodzeniem generować losowe 32-bitowe liczby całkowite:

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

ale jestem nieudany dla 64-bitowych liczb całkowitych:

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 

Czy to oczekiwane zachowanie, czy powinienem zgłosić je jako błędy w Numpy?

+1

udało ci się rozwiązać, że w końcu? – Avision

Odpowiedz

0

Problem wydaje się, że metoda random_numbers oczekuje tylko 32-bitowych liczb całkowitych.

Zgodnie z ticket #555 losowe nasiona mogą być teraz 64-bitowe od wersji 1.1.0 Sugeruję pobranie i zainstalowanie najnowszej wersji NumPy z here.

+0

Używam najnowszej wersji numpy już w wersji svn – astrofrog

+0

Która wersja mówi, że jest? – Soviut

+0

np .__ version__ daje 1.4.0.dev7539 – astrofrog

7

Dla liczb całkowitych można wygenerować 2 32 bitowych liczb losowych i połączyć je:

a + (b << 32) 
+0

generator może być odchylany. z generatorami cyklicznymi, a => b. –

+0

@ B.M. dlaczego widzisz, że może być stronniczy? czy istnieje sposób na przezwyciężenie uprzedzeń? – Avision

2

Wydaje się, że kod numpy.random.uniform() robi high-low obliczenia w pewnym momencie, a stamtąd wywodzi Inf.

Jednolicie rozproszone liczby całkowite są łatwe do wygenerowania, jak pokazano. Jednolicie rozproszone liczby zmiennoprzecinkowe wymagałyby bardziej uważnej myśli.

Jeśli chodzi o zgłaszanie tych dziwactw jako błędów, myślę, że powinieneś to zrobić lub wysłać wiadomość na listę mailingową projektu. W ten sposób dowiesz się przynajmniej, co według deweloperów jest rozsądnym zachowaniem.

0

Nie sądzę, że odnosi się do losowego wywołania początkowego. Najprostszy kod mam, że wpada „Python int zbyt duży do konwersji C długi” jest:

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

numpy. wersja = 1.5.0 tutaj

0

Zdaję sobie sprawę, że jest to bardzo stare pytanie, ale nie jest to nowa odpowiedź w Pythonie 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