Как использовать NumPy для генерации случайных чисел на интервалах сегментации - PullRequest
2 голосов
/ 21 мая 2019

Я использую модуль Numpy в Python для генерации случайных чисел.Когда мне нужно генерировать случайные числа в непрерывном интервале, такие как [a, b], я буду использовать

(b-a)*np.random.rand(1)+a

, но теперь мне нужно генерировать равномерное случайное число в интервале [a, b] и[c, d], что мне делать?

Я хочу сгенерировать случайное число, равномерное по длине всех интервалов.Я не выбираю интервал с равной вероятностью, а затем генерирую случайное число внутри интервала.Если [a, b] и [c, d] равны по длине, с этим использованием проблем не возникает, но когда длины интервалов не равны, случайные числа, сгенерированные этим методом, не являются полностью однородными.

Ответы [ 4 ]

2 голосов
/ 21 мая 2019

Вы могли бы сделать что-то вроде

a,b,c,d = 1,2,7,9
N = 10
r = np.random.uniform(a-b,d-c,N)
r += np.where(r<0,b,c)
r
# array([7.30557415, 7.42185479, 1.48986144, 7.95916547, 1.30422703,
#        8.79749665, 8.19329762, 8.72669862, 1.88426196, 8.33789181])
1 голос
/ 21 мая 2019

Вот рецепт:

def random_multiinterval(*intervals, shape=(1,)):
    # FIXME assert intervals are valid and non-overlapping
    size = sum(i[1] - i[0] for i in intervals)
    v = size * np.random.rand(*shape)
    res = np.zeros_like(v)
    for i in intervals:
        res += (0 < v) * (v < (i[1] - i[0])) * (i[0] + v)
        v -= i[1] - i[0]
    return res

In [11]: random_multiinterval((1, 2), (3, 4))
Out[11]: array([1.34391171])

In [12]: random_multiinterval((1, 2), (3, 4), shape=(3, 3))
Out[12]:
array([[1.42936024, 3.30961893, 1.01379663],
       [3.19310627, 1.05386192, 1.11334538],
       [3.2837065 , 1.89239373, 3.35785566]])

Примечание: это равномерно распределено по N (непересекающимся) интервалам, даже если они имеют разные размеры.

1 голос
/ 21 мая 2019

Вы можете использовать

np.random.uniform(a,b)

для ваших случайных чисел между a и b (включая a, но исключая b)

Так что для случайного числа в [a, b] и [c, d] вы можете использовать

np.random.choice( [np.random.uniform(a,b) , np.random.uniform(c,d)] )
0 голосов
/ 21 мая 2019

Вы можете просто назначить вероятность того, насколько вероятно, что это будет [a, b] или [c, d], а затем сгенерировать соответственно:

import numpy as np
import random

random_roll = random.random()
a = 1
b = 5
c = 7
d = 10
if random_roll > .5: # half the time we will use [a,b]
    my_num = (b - a) * np.random.rand(1) + a
else: # the other half we will use [c,d]
    my_num = (d - c) * np.random.rand(1) + c
print(my_num)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...