Python中数组中相邻元素的随机选择

2024-04-25 01:43:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个索引列表,例如0…365,我想从这个列表中随机选择几个不需要替换的相邻子区域。

index = [i+1 for i in range(365) ] 
#n could be 3
for i in range(n):
   exclusion_regions.append( get_random_contiguous_region(index) )

有人对实现get_random_continued_region()有什么建议吗


Tags: in区域列表forgetindexrangerandom
3条回答

这里有一个解决方案,它象征性地处理范围,而不是考虑每一项。在

(对于您正在处理的小基础来说,这可能是一种过度杀伤力,但是对于包含数万个项目的范围来说,它的效率会大大提高。)


编辑:我已经更新了它,允许将length指定为整数或返回整数的0参数函数。你现在可以把长度作为一个分布,而不仅仅是一个常数。在


import random

def range_intersection(a, b):
    if a.step == b.step == 1:
        return range(max(a.start, b.start), min(a.stop, b.stop), 1)
    else:
        # here be dragons!
        raise NotImplemented

def random_subrange(length, range_):
    start = random.randrange(
        range_.start,
        range_.stop - length * range_.step,
        range_.step
    )
    stop = start + length * range_.step
    return range(start, stop, range_.step)

def const_fn(n):
    def fn():
        return n
    return fn

def random_distinct_subranges(num, length, range_):
    if not callable(length):
        length = const_fn(length)
    ranges = []
    for n in range(num):
        while True:
            new_range = random_subrange(length(), range_)
            if not any(range_intersection(new_range, r) for r in ranges):
                ranges.append(new_range)
                break
    ranges.sort(key = lambda r: r.start)
    return ranges

那么

^{pr2}$

它给人的感觉是

[range(78, 92), range(147, 155), range(165, 173)]

可以像

from itertools import chain

rand_days = chain(*periods)
print(list(rand_days))

给予

[78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 147, 148, 149, 150, 151, 152, 153, 154, 165, 166, 167, 168, 169, 170, 171, 172]

您可以:

import random

n = 3
index = [i+1 for i in range(10) ] 
slices = sorted(random.sample(range(0, len(index)), 2*n))
[index[start:end] for start, end in zip(slices[::2], slices[1::2])]

我们需要一个while循环,以确保不会重叠,并且您可以检查切片的长度是否满足任何其他条件,使用列表比较,您不能指定不同的条件: 如果您希望随机切片约占列表总大小的5%到15%,样本大小约为30%:

from random import choice
from numpy import arange

index = [i + 1 for i in range(365)]
choices = []
seen = set()
ar = arange(0.05,.16, .01)
ln = len(index)
sample_size = 0
while sample_size < ln * .30:
    perc = choice(ar)  # get random 5, 10, 15 percent slices
    size = int(ln * perc)
    ch = choice(index[:-size+1]) # avoid falling off the side
    rn = index[ch:ch+size]
    if len(rn) == size and not seen.intersection(rn):
        seen.update(rn)
        choices.append(rn)
        sample_size += len(rn)
print(choices)

相关问题 更多 >