- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个数据点列表。为了程序的完整运行,我将使用所有数据点,但为了测试代码,我只想使用其中的一小部分,以便程序在短时间内运行。不过,我不想简单地获取列表的前 n 个元素;我想从列表中选择均匀分布的元素。因此,如果我使用了 50% 的数据点,我可能希望每秒从数据点列表中选择一个数据点。
基本上,我想要一个函数,它将一个列表和一个百分比作为参数,并返回一个列表,该列表由输入列表中均匀分布的元素组成,其数量尽可能接近所请求的百分比。
执行此操作的好方法是什么?
最佳答案
为了完整性,请考虑以下内容。
这个问题可以分为两部分:
在给定特定百分比或分数的情况下,确定要选取的元素数量。
选择应从列表中选择的元素。
第一点很简单。如果您想要 percentage = 35.#%
的列表,最好选择 round(len(my_list) * (percentage/100.))
元素.请注意,只有当 len(my_list)
是 (percentage/100.)
的倍数时,您才能获得完全正确的百分比。这种不准确是不可避免的,因为连续测量值(百分比)被转换为离散测量值(元素数量)。
第二点将取决于您对应该返回哪个元素的特殊要求。选择尽可能均匀分布的元素是可行的,但肯定不是最简单的方法。
从概念上讲,您将如何执行此操作(请参阅下面的实现):
如果您有一个长度为 l
的列表,您希望其中的某个均匀分布的分数 f
(f = percentage/100。
) 您必须将列表的索引分箱到大小为 l/round(l * f)
的 round(l * f)
分箱中。您想要的是包含每个 bin 最中心元素的列表。
为什么会这样?
对于第一点,请注意,如果我们制作大小为 l/round(l * f)
的 bin,我们将得到 l/l/round(l * f) = round (l * f)
垃圾箱在最后。这是理想的数量(见上文第 1 点)。如果对于这些大小相同的容器中的每一个,然后我们选择最中心的元素,我们将得到一个尽可能均匀分布的元素列表。
这是一个简单的(既没有优化速度也没有非常漂亮)的实现:
from bisect import bisect_left
def equal_dist_els(my_list, fraction):
"""
Chose a fraction of equally distributed elements.
:param my_list: The list to draw from
:param fraction: The ideal fraction of elements
:return: Elements of the list with the best match
"""
length = len(my_list)
list_indexes = range(length)
nbr_bins = int(round(length * fraction))
step = length / float(nbr_bins) # the size of a single bin
bins = [step * i for i in xrange(nbr_bins)] # list of bin ends
# distribute indexes into the bins
splits = [bisect_left(list_indexes, wall) for wall in bins]
splits.append(length) # add the end for the last bin
# get a list of (start, stop) indexes for each bin
bin_limits = [(splits[i], splits[i + 1]) for i in xrange(len(splits) - 1)]
out = []
for bin_lim in bin_limits:
f, t = bin_lim
in_bin = my_list[f:t] # choose the elements in my_list belonging in this bin
out.append(in_bin[int(0.5 * len(in_bin))]) # choose the most central element
return out
我们现在可以将这种理想算法 (equal_dist_els) 与@jonrsharpe 的切片方法进行比较:
请参阅下面的代码。
沿 x 轴是要返回的元素的期望分数,在 y 轴上是期望分数与两种方法返回的分数之间的绝对差值。我们看到对于大约 0.7 (~70%) 的分数,切片方法的偏差是显着的,即如果你要求~70%,切片方法返回所有元素 (100%),这几乎是 45% 的偏差。
总而言之,我们可以说@jonrsharpe 的切片方法适用于小分数 (>>0.1
),但在选择较大分数时变得越来越不准确。另请注意,不准确性与列表的长度无关。分箱算法的实现当然稍微复杂一些,而且很可能也慢得多。然而,它的不准确性只是由上面提到的不可避免的不准确性给出的,随着列表长度的增加而减少。
绘图代码:
from matplotlib import pyplot as plt
# def of equal_dist_els see above
def select_els(seq, perc):
"""Select a defined percentage of the elements of seq."""
return seq[::int(round(1./perc if perc != 0 else 0))]
list_length = 50
my_list = range(list_length)
percentages = range(1, 101)
fracts = map(lambda x: x * 0.01, percentages)
equal_dist = map(lambda x: abs(len(equal_dist_els(my_list, x)) / float(len(my_list)) - x), fracts)
slicing = map(lambda x: abs(len(select_els(my_list, x)) / float(len(my_list)) - x), fracts)
plt.plot(fracts, equal_dist, color='blue', alpha=0.8, linewidth=2, label=r'equal_dist_elements')
plt.plot(fracts, slicing, color='red', alpha=0.8, linewidth=2, label=r'select_elements by @jonrsharpe')
plt.title('Choosing equally dist. fraction of els from a list of length %s' % str(list_length))
plt.xlabel('requested fraction')
plt.ylabel('absolute deviation')
plt.legend(loc='upper left')
plt.show()
关于python - 如何提取 Python 列表中一定比例的均匀分布的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28408106/
我有代码可以制作任意长度的二进制列表,并打开随机位数: rand_binary_list = lambda n: [random.randint(0,1) for b in range(1,n+1)]
假设我有 20 个攻击回合的回合制游戏,并且玩家的攻击速度决定了他们攻击的频率,当一个人的攻击速度为 5 时,您将如何计算和/或绘制一张“谁在何时攻击”的表格另一个速度为8? (这些是测试值,我将使用
我将我的类定义为: final class Key> { private final T q; private final T o; public Key(T q1, T o1
想象一下10辆车随机,均匀分布在长度为1的圆形轨道上。如果位置用[0,1>范围内的C double表示,那么它们可以排序,车之间的间隙应该是车的位置前面减去后面汽车的位置。最后一个间隙需要添加 1 来
我正在尝试构建一个均匀分布矩阵,每一行都以相同的速率衰减到 0。分布应该在 -1 和 1 之间。我正在看的是构建类似于以下内容的东西: [[0.454/exp(0) -0.032/exp(1) 0.6
我希望盒子像这样展开: 彼此正好相距 218 像素。 我试着把它们都放在一起,但我无法做到完美! .box1, .box2 { margin: 0 20px } 有没有更好的方法来解决这个问题? 忘了
所以我一直在构建一个程序,该程序使用蒙特卡罗模拟来寻找进化图论的属性。它的一个关键功能是能够生成均匀分布的随机图,这样我们就可以确定图的广义性质。对于连接无向图的情况,我已经实现了 this 中概述的
在响应式网站的页脚中,我需要均匀分布一些 li 项。 这是我想要实现的: 这就是我所拥有的: 我想避免为每个 li 设置绝对宽度,以保持网站这部分的响应能力。 继续进行的最佳方式是什么? 最佳答案 你
LinearLayout 的常见用法是平均空间(权重) View ,例如: 如何使用新的 ConstraintLayout 实现这样的等间距 View ? ConstraintLayout 引用链接:
如果我在一个集群中创建 3 个节点,我如何在容器之间均匀分布 docker 容器?例如,如果我创建一个由 3 个节点组成的集群,每个节点上有 8 个 cpu,我通过性能分析确定,当我在每个 cpu 上
我有一个包含 ViewModel 的 ObservableCollection,它又定义了我的按钮定义。 我已经做了几个小时了,一篇又一篇地阅读文章,但无济于事。我试过使用列表框,这是我最接近的。我的
如何使用 ConstraintLayout 获得 5 个均匀分布的正方形,并根据屏幕宽度设置灵活大小? 最佳答案 您需要创建一个连接在其父容器所有边上的小部件链(您可以将此父容器的尺寸设置为您想要/需
我有 100 个元素以随机顺序进入视口(viewport)。它们需要一起在 DOM 容器内形成一个圆圈。我需要一些方法来计算元素需要移动到的位置... 结构是这样的: http://codepen.i
我正在尝试在 Storyboard中为 iPad 和 iPhone 创建用户界面。 iphone 版本少了 1 个按钮。所有按钮和辅助 View 都固定在底部的 LayouGuide 上。此外,我正在
我正在向 添加图像和一些文本输入 (FloatLabelTextInput)在 react native 应用程序中。到目前为止,我在使用 flex 将图像和文本输入均匀分布在 y 轴上时运气不佳。
有一个导航栏 ,里面是一个每个 包含 带有链接(这是用于导航栏) 我查看了 Google 和这个网站,但找不到我要找的东西。 我想要的是能够保持我当前的风格(使用 和 在里面),我想要 在 内
我正在尝试创建一个布局,其中每个 DIV 的最大宽度为 300 像素。 如果屏幕是 600 像素,那么两个 100% 的 div 应该并排放置。如果屏幕是 700px,那么三个 233px(每个 DI
我实现了 Xorshift 生成器和其他生成器来比较它们在我的系统(Windows 和 Linux)上的性能。 https://en.wikipedia.org/wiki/Xorshift http:
我想通过收敛概率曲线图比较几种算法。 目前,我的图表如下所示: 这不允许看到许多曲线的差异。 我希望 y Axis 为“对数”,但与值 1 不同,即我希望 y 值为 [0, 1/2, 3/4, 7/8
我是一名优秀的程序员,十分优秀!