gpt4 book ai didi

python - (几乎)从列表中均匀选择项目

转载 作者:太空宇宙 更新时间:2023-11-03 15:51:28 50 4
gpt4 key购买 nike

我有一个 N 的列表元素,我想抽样 M (<= N)尽可能均匀分布的值。更具体地说,假设选择应该最小化采样点之间的间距差异。例如,假设我正在构造一个 bool 索引数组(即在 python 中)来选择元素,

我尝试了算法(来自这个相似但不同的问题:How do you split a list into evenly sized chunks?):

q, r = divmod(N, M)
indices = [q*jj + min(jj, r) for jj in range(M)]

有时效果很好:

N=11 M=6
good_index = [0 1 0 1 0 1 0 1 0 1 0]

N=14 M=6
good_index = [0 1 1 0 1 1 0 1 0 1 0 1 0 1]

这里,第一个例子很简单,因为数组可以被均分。第二个例子不能均分,但是点之间的间距尽可能相似(2, 2, 1, 1, 1, 1)。

但通常效果不佳:

N=16 M=10
bad_index = [0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0]

N=14 M=10
bad_index = [0 1 0 1 0 1 0 1 0 0 0 0 0 0]

因为你在最后堆积了值(value)。


编辑 1:糟糕,刚刚意识到上面的每个列表在技术上都是颠倒的(0 应该是 1,反之亦然)......但应该仍然传达正确的想法。


编辑 2:上述算法往往工作得更好(即通过选择随机数进行目视检查,而不是像概念上更简单的东西,

step = int(floor(N/M))
last = M * step # this prevents us from getting M+1 elements
indices = [ii for ii in range(0, last, step)]

最佳答案

查看一些测试的结果(甚至是上面包含的那些),问题是什么时候 M > N/2 . IE。当超过一半的值被采样时。但它非常适合 M < N/2 .所以我目前使用的解决方案只是在 M > N/2 时反转问题。 :

注意:这实际上是创建一个大小为 N 的屏蔽列表对于 MFalse元素尽可能均匀分布。

import numpy as np

def even_select(N, M):
if M > N/2:
cut = np.zeros(N, dtype=int)
q, r = divmod(N, N-M)
indices = [q*i + min(i, r) for i in range(N-M)]
cut[indices] = True
else:
cut = np.ones(N, dtype=int)
q, r = divmod(N, M)
indices = [q*i + min(i, r) for i in range(M)]
cut[indices] = False

return cut

如果存在更优雅的解决方案,我仍然会感兴趣。

关于python - (几乎)从列表中均匀选择项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46494029/

50 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com