Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 加权numpys random.间隔的选择_Python_Numpy_Random - Fatal编程技术网

Python 加权numpys random.间隔的选择

Python 加权numpys random.间隔的选择,python,numpy,random,Python,Numpy,Random,我想伪随机地从半开放区间创建一个事务值数组,例如[1,5]、[5,10]、[10,25)等等。区间中的每个数字都有相同的机会被选取,但我想调整获得某些区间的概率,而不是其他区间。流程应该如下所示: 1: Pick any of the defined intervals > Pick a random number in the interval > Append number in array 2: Pick any of the defined intervals > Pi

我想伪随机地从半开放区间创建一个事务值数组,例如
[1,5]、[5,10]、[10,25)
等等。区间中的每个数字都有相同的机会被选取,但我想调整获得某些区间的概率,而不是其他区间。流程应该如下所示:

1: Pick any of the defined intervals > Pick a random number in the interval > Append number in array
2: Pick any of the defined intervals > Pick a random number in the interval > Append number in array
...
n: Pick any of the defined intervals > Pick a random number in the interval > Append number in array
我的代码是:

import numpy as np
# set interval limits
a,b,c,d,e,f,g,h,i,j = 1,5,10,25,50,100,200,300,500,1000
# start picking random numbers
np.random.seed(33)
trx_value = np.random.choice([np.random.uniform(a,b), 
                              np.random.uniform(b,c),
                              np.random.uniform(c,d),
                              np.random.uniform(d,e),
                              np.random.uniform(e,f),
                              np.random.uniform(f,g),
                              np.random.uniform(g,h),
                              np.random.uniform(h,i),
                              np.random.uniform(i,j)], 20, 
                              p=[0.1, 0.15, 0.2, 0.2, 0.15, 0.1, 0.05, 0.03, 0.02])
trx_value
它似乎以不同的方式工作,因为结果并没有显示我所期望的值的唯一性:

> array([  8.22611761,   8.22611761, 127.05325134,   8.22611761,
>        266.53172436,  35.43526485,  35.43526485,  88.57366253,
>        127.05325134,  12.38946805, 266.53172436, 127.05325134,
>         12.38946805,  35.43526485, 127.05325134,  12.38946805,
>        266.53172436,   8.22611761])
它似乎在做这样的事情:

1: For each interval, pick a random number > Store this number in a pool
2: Pick a random number from the pool > Append number in array
...
n: Pick a random number from the pool > Append number in array

我确信这是一个思考问题,但我想知道,如果不使用
for
循环这是可能的,因为您希望从中选择的所有分布都是统一的,我建议使用以下设置

interval_p = np.array([0.1, 0.15, 0.2, 0.2, 0.15, 0.1, 0.05, 0.03, 0.02])
interval_lo = np.array([1,5,10,25,50,100,200,300,500])
interval_hi = np.concatenate([lo[1:], [1000]])
interval_width = interval_hi - interval_lo

n = 20
c = np.random.choice(len(interval_p), p=interval_p, size=n)
results = interval_lo[c] + np.random.uniform(size=n) * interval_width[c]

这是因为我们可以使用
a+r*(b-a)
[0,1]
上的统一分布
r
重新缩放为
[a,b]
上的任何统一分布,因为您希望从中选择的所有分布都是统一的,因此我建议使用以下设置

interval_p = np.array([0.1, 0.15, 0.2, 0.2, 0.15, 0.1, 0.05, 0.03, 0.02])
interval_lo = np.array([1,5,10,25,50,100,200,300,500])
interval_hi = np.concatenate([lo[1:], [1000]])
interval_width = interval_hi - interval_lo

n = 20
c = np.random.choice(len(interval_p), p=interval_p, size=n)
results = interval_lo[c] + np.random.uniform(size=n) * interval_width[c]

这是因为我们可以使用
a+r*(b-a)

[0,1]
上的均匀分布
r
重新缩放为
[a,b]
上的任何均匀分布,然后使用
a+r*(b-a)

您只需制作
interval=np.array([1,5,10,25,501002003005001000])
,然后使用
interval\u width=np diff(interval)
并使用
interval[:-1]
而不是
interval\u lo
。使其更具可读性。谢谢!它可以工作,使用@DanielF推荐更具可读性。你可以说,当你与数学背景很强的人打交道时:)你只需制作
interval=np.array([1,5,10,25,501002002002002005001000])
然后使用
interval\u width=np.diff(interval)
并使用
interval[:-1]
而不是
interval\u lo
。使它更具可读性。谢谢!它很管用,@DanielF建议更具可读性。你可以说,当你与具有强大数学背景的人打交道时:)