Я хочу нарушить набор точек, предполагающих нормальное распределение. Я использую 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, что позволяет избежать ручных циклов?
Большое спасибо за любую помощь, которую вы можете предоставить!
Похоже, scipy.stats.rv_continuous() принимает только скалярные значения для границ a и b (scipy version 0.17) ... – aim