如何从分数向量中进行选择并尊重元素的数量?[复制]

How to select from a vector of fractions and respect the number of elements? [duplicate]

提问人:zdm 提问时间:8/21/2023 更新时间:8/21/2023 访问量:28

问:

我有一个类型的分数向量,当然是.这些分数代表某个数字的执着。因此,乘以我们得到每个分数中的元素数。a = [0.04352034965262487, 0.480655360084497, 0.02655889003246612, 0.449265400230412, 0.0]float64sum(a)=1K=128aKa*K =[5.570604755535983, 61.523886090815616, 3.3995379241556636, 57.50597122949274, 0.0]

我想将这个向量转换为向量,并尊重 to be 的元素之和。我正在做的是,但这会给而不是.当我这样做时,我得到,当我这样做时,我得到.a*Kinta*KKfloor126128round129ceil130

我想应用然后随机删除超过 .有没有更好的方法?ceil128

角地板 CEIL

评论

0赞 Mark 8/21/2023
这是蟒蛇吗?

答:

1赞 eri24816 8/21/2023 #1

这可以通过首先应用地板来实现,然后选择具有最大分数部分的项目并向其中添加一个,其中是a*KnnK - sum(floor(a*K))

在 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))