python库/函数,根据离散分布将整数拆分为一组整数(整数)



我正在寻找一个python库/函数,它将一个整数分割为基于离散分布的一组整数(整数)

eg: 10 with distribution [0.2, 0.3 and 0.5] should result in [2, 3, 5]
14 with same distribution should result in [3, 4, 7]
similarly for,
1 => [0, 0, 1]
2 => [0, 1, 1]
3 => [1, 1, 1] or [0, 1, 2]

在任何情况下,输出列表都应该等于给定的输入。

我可以编写一个自定义函数来完成此操作,但不想错过任何明显的库。我试着在numpy/scipy中找到一个函数,但找不到。

您可以组合使用几个numpy函数,但是您需要用稍微不同的方式来表达您的发行版:

dist    = [0.2, 0.3, 0.5]        # must add up to exactly 1.
cumDist = np.cumsum([0] + dist)  # express as a cumulative from zero
for N in range(1,15): 
print(N,np.diff(np.rint(cumDist*N))) # apply distribution (rounded)
1 [0. 0. 1.]
2 [0. 1. 1.]
3 [1. 1. 1.]
4 [1. 1. 2.]
5 [1. 1. 3.]
6 [1. 2. 3.]
7 [1. 3. 3.]
8 [2. 2. 4.]
9 [2. 2. 5.]
10 [2. 3. 5.]
11 [2. 4. 5.]
12 [2. 4. 6.]
13 [3. 3. 7.]
14 [3. 4. 7.]

如果你将你的分布表示为整数(例如百分比),你可以得到np.int数字作为输出(不使用np. print):

dist    = [20, 30, 50]           # integer percentages
cumDist = np.cumsum([0] + dist)  # express as a cumulative 
for N in range(1,15):
print(N,np.diff(cumDist*N//cumDist[-1]))
1 [0 0 1]
2 [0 1 1]
3 [0 1 2]
4 [0 2 2]
5 [1 1 3]
6 [1 2 3]
7 [1 2 4]
8 [1 3 4]
9 [1 3 5]
10 [2 3 5]
11 [2 3 6]
12 [2 4 6]
13 [2 4 7]
14 [2 5 7]

请注意,这不会四舍五入计算,因此分布略有不同。它也可以用于非整数分布(例如0.2,0.3,0.5),但它不会返回np.int数据类型。

相关内容

  • 没有找到相关文章

最新更新