如何从分数向量中进行选择并尊重元素数量?

问题描述 投票:0回答:1

我有一个

a = [0.04352034965262487, 0.480655360084497, 0.02655889003246612, 0.449265400230412, 0.0]
类型的分数向量
float64
,当然
sum(a)=1
。这些分数代表某个数字的百分比
K=128
。因此,将
a
乘以
K
,我们就得到了每个分数
a*K =[5.570604755535983, 61.523886090815616, 3.3995379241556636, 57.50597122949274, 0.0]
中的元素数量。

我想将这个向量

a*K
转换为
int
向量,并将
a*K
的元素之和设为
K
。我正在做的是
floor
但这会给出
126
而不是
128
。当我做
round
时,我获得
129
,当我做
ceil
时,我获得
130

我想到应用

ceil
,然后随机删除超过
128
的2个元素。有更好的办法吗?

rounding floor ceil
1个回答
0
投票

这可以通过首先对

a*K
应用下限,然后选择具有最大小数部分的
n
项目并向其添加一个来完成。

在Python中:

from math import floor

aK = [5.570604755535983, 61.523886090815616, 3.3995379241556636, 57.50597122949274, 0.0]
K = 128

# Sum of floored is less than K.
floored = [floor(x) for x in aK]
print(floored, sum(floored))

# Add 1 to each items with largest fractional part
frac = [x - y for x, y in zip(aK,floored)]
frac_rank = sorted(range(len(frac)), key=frac.__getitem__, reverse=True)
for i in frac_rank[:K - sum(floored)]:
    floored[i] += 1

# Now floored adds up to K
print(floored, sum(floored))
© www.soinside.com 2019 - 2024. All rights reserved.