只是想知道是否存在针对此类问题的更好解决方案。

我们知道,对于偶数的X / Y百分比拆分,我们可以获得数据的精确拆分-例如,数据大小为10:

10 * .6 = 6
10 * .4 = 4
          10


这样分割数据很容易,我们可以保证拥有所有数据,并且不会丢失任何数据。但是我努力的地方是不太友好的数字-拿11

11 * .6 = 6.6
11 * .4 = 4.4
          11


但是,例如,我们无法索引到i = 6.6的数组。因此,我们必须决定如何执行此操作。如果仅取整数部分,我们将丢失1个数据点-

First set = 0..6
Second set = 6..10


如果我们将数字设为底数,情况将相同。

但是,如果我们以数字为上限:

First set = 0..7
Second set = 7..12


我们已经读完了数组的结尾。

当我们进行第3或第4分割(例如30,30,20,20)时,情况变得更糟。

是否有针对这些问题的标准拆分程序?是否接受数据丢失?对于相关数据(例如时间序列),似乎数据丢失是不可接受的。

谢谢!

编辑:值.6.4由我选择。它们可以是两个总和为1的数字。

最佳答案

首先,请注意,您的问题不仅限于您声称的奇数大小的数组,还包括任何大小的数组。您如何将10个元素的数组分成56%-44%?还是4元素阵列的60%-40%分割?

没有标准程序。在许多情况下,程序员不太在乎精确的分割,而是通过对一个数量(第一组的大小)取底或四舍五入,而对另一个数量(数组长度-取整大小)取补码(四舍五入)。秒的大小)。

在大多数情况下,这是一次性计算,并且不需要精度时,可以这样做。您必须问自己自己的要求是什么。例如:您是否要获取数千个10个大小的数组,而每次将它们拆分56%-44%都会进行一些计算并返回结果?您必须问自己想要什么精度。您是否会担心结果是否最终被
60%-40%还是50%-50%?

再举一个例子,假设您正在进行25%-25%-25%-25%的4路均分。如果您有10个元素,并且应用了舍入技术,那么最终将得到3,3,3,1个元素。当然,这会弄乱您的结果。

如果您确实关心所有这些不准确性,那么第一步就是考虑您是否可以调整数组大小和/或拆分比率。

如果将它们固定在一块,那么对任何大小的阵列的任何比率进行精确分割的唯一方法就是使其具有概率。您必须拆分多个数组才能起作用(这意味着您必须多次将相同的拆分比例应用于相同大小的数组)。数组越多越好(或者您可以多次使用同一数组)。

因此,假设您必须对10个大小的阵列进行56%-44%的分割。这意味着您需要将其平均分为5.6个元素和4.4个元素。

有许多方法可以实现5.6元素平均值。最简单的方法(以及尝试序列中方差最小的方法)是,具有6个元素的集合占60%的时间,具有5个元素的集合占40%的时间。

0.6 * 6 + 0.4 * 5 = 5.6

就代码而言,这是每次确定集合大小的方法:

import random

array_size = 10
first_split = 0.56
avg_split_size = array_size * first_split
floored_split_size = int(avg_split_size)

if avg_split_size > floored_split_size:
    if random.uniform(0,1) > avg_split_size - floored_split_size:
        this_split_size = floored_split_size
    else:
        this_split_size = floored_split_size + 1
else:
    this_split_size = avg_split_size


您可以使代码更紧凑,在这里我只是概述了一下,以便您理解。我希望这有帮助。

关于python - 捕获非整列中的所有数据,测试并验证拆分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40198330/

10-13 09:14
查看更多