在 python 中的列表元素中设置最小阈值
Set a minimum threshold among the elements of a list in python
假设我想创建一个包含数千个元素(浮点数)的列表。我想在所有项目中设置一个最低阈值。所以在每一步中,我想将一个元素(浮点数)附加到列表中,我想检查添加的数字是否与所有元素的差异最小。
是这样的:我有一个数字列表(1.2、2.7、0.7、4.9),我想添加一个新元素。它应该检查随机生成的数字是否具有所有元素的最小阈值,如果没有生成另一个数字并再次检查阈值。
如果你能给我一个提示,我将不胜感激。
你可以这样做:
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))
编辑:添加了检查是否存在要探索的有效配置。
假设我想创建一个包含数千个元素(浮点数)的列表。我想在所有项目中设置一个最低阈值。所以在每一步中,我想将一个元素(浮点数)附加到列表中,我想检查添加的数字是否与所有元素的差异最小。
是这样的:我有一个数字列表(1.2、2.7、0.7、4.9),我想添加一个新元素。它应该检查随机生成的数字是否具有所有元素的最小阈值,如果没有生成另一个数字并再次检查阈值。
如果你能给我一个提示,我将不胜感激。
你可以这样做:
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))
编辑:添加了检查是否存在要探索的有效配置。