2016-03-07 3 views
0

Я хочу нарушить набор точек, предполагающих нормальное распределение. Я использую scipy.stats.truncnorm, так как мне нужно убедиться, что возмущенные точки всегда положительны. Вот MWE:scip.stats.truncnorm - ошибка с использованием массивов для определения местоположения и масштаба

import numpy as np 
from scipy.stats import truncnorm 

# Generate points to perturb 
N = 100000 
z = np.random.rand(N) 
sigmaz = (z+1.0)*0.03 

# Set limits for truncnorm 
a = (0.0-z)/sigmaz 
b = np.ones_like(z)*np.inf 

# Set size -- want to sample once for each point 
size = tuple(np.ones(len(z))) 
print truncnorm.rvs(a=a,b=b,loc=z,scale=sigmaz,size=size) 

Однако, я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "./test.py", line 17, in <module> 
    print truncnorm.rvs(a=a,b=b,loc=z,scale=sigmaz,size=size) 
    File "/share/modules/install_dir/anaconda/lib/python2.7/site-packages/scipy/stats/_distn_infrastructure.py", line 818, in rvs 
    cond = logical_and(self._argcheck(*args), (scale >= 0)) 
    File "/share/modules/install_dir/anaconda/lib/python2.7/site-packages/scipy/stats/_continuous_distns.py", line 3796, in _argcheck 
    if self.a > 0: 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

Так ли кто-нибудь знает, как обойти эту ошибку и указать массивы для среднего и сигмы, каждый со своими собственное значение для границ a, b?

Или кто-нибудь знает о другом способе сделать это в python, что позволяет избежать ручных циклов?

Большое спасибо за любую помощь, которую вы можете предоставить!

+0

Похоже, scipy.stats.rv_continuous() принимает только скалярные значения для границ a и b (scipy version 0.17) ... – aim

ответ

0

Это известная ошибка. Усеченное нормальное распределение не принимает значения типа и масштаба массива. Большинство дистрибутивов, но не это.

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