2015-11-19 4 views
4

Рассмотрим код:Неожиданное поведение scipy.stats.uniform

import scipy.stats as ss 
x = ss.uniform.rvs(np.zeros(5),np.array([1,2,3,4,5])) 

Я нахожу documentation для scipy.stats немного разреженный. Из того, что я могу сказать, я думаю, что указанный код должен выбирать случайное число между каждым из [0,1], [0,2], [0,3], [0,4] и [0,5 ]. Вот документация для rvs и uniform.

Вместо этого он выбирает случайное число р в [0,1] и возвращает [р, 2р, 3р, 4р, 5р]:

print x, np.diff(x) 
[ 0.79352054 1.58704108 2.38056162 3.17408215 3.96760269] 
[ 0.79352054 0.79352054 0.79352054 0.79352054] 

Является ли это семя, связанные ошибка? Или такое поведение ожидается?

Редактировать: Я знаю, что легко обойти это; не нужно мне рассказывать, как: x=ss.uniform.rvs(size=5)*np.arange(1,5). Эта ошибка или функция стоили мне пару дней путаницы и отладки в моей более крупной программе.

ответ

4

Это ошибка: https://github.com/scipy/scipy/issues/2069

Другой обходного для примера, чтобы дать size аргумент явно наряду с аргументами, которые вы уже используете.

Например, вот багги случай:

In [1]: import scipy.stats as ss 

In [2]: x = ss.uniform.rvs(np.zeros(5), np.array([1,2,3,4,5])) 

In [3]: x 
Out[3]: array([ 0.23848443, 0.47696885, 0.71545328, 0.9539377 , 1.19242213]) 

In [4]: x/x[0] 
Out[4]: array([ 1., 2., 3., 4., 5.]) 

работа вокруг должна включать аргумент size=5:

In [18]: x = ss.uniform.rvs(np.zeros(5), np.array([1,2,3,4,5]), size=5) 

In [19]: x 
Out[19]: array([ 0.67638863, 1.2253443 , 0.0812362 , 3.87469514, 3.88145975]) 

In [20]: x/x[0] 
Out[20]: array([ 1.  , 1.81159802, 0.12010285, 5.72850428, 5.73850534]) 
+0

Интересно, спасибо! –

0

смотрит на меня как проблема в uniform.rvs, которая пытается справиться как *args, так и size. Если я сначала создаю объект uniform, а затем вызовет rvs, он, кажется, ведет себя.

Чтобы создать 3 равномерных распределения по диапазонам [0,1), [5,7], [10,13), я могу определить объект uniform с начальным диапазоном 0,5,10 и наборами диапазонов 1,2,3:

In [543]: u=stats.uniform(np.array([0,5,10]),np.array([1,2,3])) 

Теперь я могу генерировать любое распределение по размерам, которое имеет совместимый размер 3 размер:

In [544]: x = u.rvs((5,3)) 
In [545]: x 
Out[545]: 
array([[ 0.28689704, 6.60720428, 12.78343224], 
     [ 0.3058824 , 6.22486472, 11.5212319 ], 
     [ 0.32274603, 6.72905376, 10.90760859], 
     [ 0.98299464, 5.39877562, 12.00342556], 
     [ 0.76728063, 5.26172895, 10.38177301]]) 
In [546]: x.mean(axis=0) 
Out[546]: array([ 0.53316015, 6.04432547, 11.51949426]) 

Это может быть просто еще один способ вокруг пропавшего size параметра в stats.uniform.rvs вызов.

Смежные вопросы