【问题标题】:Set a minimum threshold among the elements of a list in python在python中的列表元素之间设置最小阈值
【发布时间】:2020-05-06 09:37:27
【问题描述】:

假设我想创建一个包含数千个元素(浮点数)的列表。我想在所有项目中设置一个最小阈值。所以在每一步中,我想在列表中追加一个元素(浮点数),并且我想检查添加的数字是否与所有元素的差异最小。

类似这样:我有一个数字列表(1.2、2.7、0.7、4.9),我想添加一个新元素。它应该检查随机生成的数字是否具有所有元素的最小阈值,如果它没有生成另一个数字并再次检查阈值。

如果您能给我一个提示,我将不胜感激。

【问题讨论】:

  • 你能把这个最小阈值的想法说得更明确一点吗?
  • 我想生成 1000 个随机数,我想检查生成的数字是否至少有最小差异。例如:如果阈值是 0.5 并且我的列表是 (1.2, 1.9) 那么如果我附加一个等于 1.4 的随机数那么这不应该添加到列表中因为 1.4 - 1.2 = 0.2 并且它小于 0.5 作为阈值.它应该生成另一个数字。例如这次是 2.6。此数字具有列表元素的最小阈值:2.6 - 1.9 > 0.5 和 2.6 - 1.2 > 0.5
  • 好的,但是您是要生成 1000 个数字 并过滤掉其中的一些(可能使结果列表比 1000 短得多)还是要生成新的随机数?直到您的列表包含 1000 个“好”数字?有区别,你知道的……
  • 其实我想拥有1000个好数字。因此,也许我需要随机生成更多数字(可能是数千个!),并定期检查它们是否满足每个元素的最小阈值。

标签: python list random threshold


【解决方案1】:

你可以这样做:

import random

def generate_list_min_threshold(size=1000, threshold=0.01, min_value=-10, max_value=10, seed=1):
    random.seed(seed)
    ret = []
    while len(ret) < size:
        candidate = random.uniform(min_value,max_value)  # changed based on comment from Błotosmętek
        if all(abs(candidate-value) > threshold for value in ret):
            ret.append(candidate)
    return ret

显然,这会尝试对[min_value, max_value] 中的值进行统一采样,甚至可能没有要添加的有效数字(取决于阈值配置)。考虑到列表中的当前元素,为了获得更好的性能,您可能需要考虑条件分布。

关于分解概率质量并通过递归仅对有效候选者进行抽样的其他建议:

def sample_min_threshold(size=10000, min_value=-10000, max_value=10000, threshold=0.01):
    if size == 0:
        return []

    if (max_value-min_value)/threshold < size:
        raise ValueError("No valid configuration.", size, (max_value-min_value)/threshold)

    value = random.uniform(min_value, max_value)
    mass_left = (value-min_value)/(max_value-min_value)
    mass_right = 1 - mass_left

    n_left = math.floor(mass_left*size)
    n_right = math.floor(mass_right*size)

    return (sample_min_threshold(size=n_left, min_value=min_value, max_value=value-threshold) + 
            [value] + 
            sample_min_threshold(size=n_right, min_value=value+threshold, max_value=max_value))

编辑:添加了检查是否存在要探索的有效配置。

【讨论】:

  • random.random()*(max_value-min_value) + min_value 更好地表达为random.uniform(min_value,max_value)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 2011-03-15
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2018-03-03
相关资源
最近更新 更多