我想用numpy.random.normal创建一个只包含正值的普通分布式数组。 例如,以下说明它有时会给出负值,有时会给出正值。如何修改它以便只返回正值?
>>> import numpy
>>> numpy.random.normal(10,8,3)
array([ -4.98781629, 20.12995344, 4.7284051 ])
>>> numpy.random.normal(10,8,3)
array([ 17.71918829, 15.97617052, 1.2328115 ])
>>>
我想我可以这样解决它:
myList = numpy.random.normal(10,8,3)
while item in myList <0:
# run again until all items are positive values
myList = numpy.random.normal(10,8,3)
答案 0 :(得分:6)
根据定义,正态分布从-inf扩展到+ inf,因此您要求的内容在数学上没有意义。
您可以采用正态分布并将绝对值“剪切”为正值,或者只是丢弃负值,但您应该理解它将不再是正态分布。
答案 1 :(得分:1)
您可以将整个数组偏移到数组的最低值(最左侧)。你得到的可能不是真正的正态分布&#34;,但在你的工作范围内,处理有限数组,你可以确保这些值是正的并且适合在钟形曲线下。
>>> mu,sigma = (0,1.0)
>>> s = np.random.normal(mu, 1.0, 100)
>>> s
array([-0.58017653, 0.50991809, -1.13431539, -2.34436721, -1.20175652,
0.56225648, 0.66032708, -0.98493441, 2.72538462, -1.28928887])
>>> np.min(s)
-2.3443672118476226
>>> abs(np.min(s))
2.3443672118476226
>>> np.add(s,abs(np.min(s)))
array([ 1.76419069, 2.85428531, 1.21005182, 0. , 1.14261069,
2.90662369, 3.00469429, 1.3594328 , 5.06975183, 1.05507835])
答案 2 :(得分:1)
我认为你的意思是你要修改概率密度,使其在正范围内与正常形状相同,在负数范围内为零。这是一个非常常见的实际案例。在这种情况下,您不能简单地采用生成的正态随机变量的绝对值。相反,你必须生成一个新的独立的正态分布数,直到你得出一个正数。一种方法是递归地,见下文。
import numpy as np
def PosNormal(mean, sigma):
x = np.random.normal(xbar,delta_xbar,1)
return(x if x>=0 else PosNormal(mean,sigma))
答案 3 :(得分:0)
如何在这些方面使用lognormal:
mu = np.mean(np.log(list))
sigma = np.std(np.log(list))
new_list = np.random.lognormal(mu, sigma, length_of_new_list)
答案 4 :(得分:0)
data = np.random.randint(low = 1,high = 100,size =(4,4),dtype ='int')
答案 5 :(得分:0)
或者您可以通过减去最小值(或加上最小值的绝对值)来将整个分布“右移”到“右”:
y = np.random.normal(0.0, 1.0, 10)
y
array([-0.16934484, 0.06163384, -0.29714508, -0.25917105, -0.0395456 ,
0.17424635, -0.42289079, 0.71837785, 0.93113373, 1.12096384])
y - min(y)
array([0.25354595, 0.48452463, 0.12574571, 0.16371974, 0.38334519,
0.59713714, 0. , 1.14126864, 1.35402452, 1.54385463])
答案 6 :(得分:0)
这个问题是合理的。为了获得动力,请考虑simulations of biological cells。细胞中某种分子的数量分布可以通过正态分布进行近似估算,但必须非负值才能具有物理意义。
我的整个模拟器使用这种方法来采样分子计数的初始分布:
def non_neg_normal_sample(random_state, mean, std, max_iters=1000):
""" Obtain a non-negative sample from a normal distribution
The distribution returned is normal for 0 <= x, and 0 for x < 0
Args:
random_state (:obj:`numpy.random.RandomState`): a random state
mean (:obj:`float`): mean of the normal dist. to sample
std (:obj:`float`): std of the normal dist. to sample
max_iters (:obj:`int`, optional): maximum number of draws of the true normal distribution
Returns:
:obj:`float`: a normal sample that is not negative
Raises:
:obj:`ValueError`: if taking `max_iters` normal sample does not obtain one that is not negative
"""
iter = 0
while True:
sample = random_state.normal(mean, std)
iter += 1
if 0 <= sample:
return sample
if max_iters <= iter:
raise ValueError(f"{iter} draws of a normal dist. with mean {mean:.2E} and std {std:.2E} "
f"fails to obtain a non-negative sample")
我通过两种方式扩展@ gena-kukartsev的答案:首先,我避免了可能会使调用堆栈溢出的递归。 (让我们避免使用可能使stackoverflow上的堆栈溢出的答案!)其次,我通过限制分布的样本数来捕获可能不好的输入。
答案 7 :(得分:0)
您可以使用低比例的高 loc:
dependencies{
compile (':project A')
}