numpy random.choise -获取几个值,它们之间的距离最小

cl25kdpy  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(116)

我使用numpy的random.choise来获取范围(0,1000)内的n个整数,其中同一个整数不能被选择两次(replace=false)。
但是由于每个整数都是一个具有一定长度(例如-10)的子列表的起点,所以我希望随机函数不从已经选择的整数中选择任何其他+- 10的整数。
使用p=参数是不可能的,因为我事先不知道哪些n会被选择。(可以使用循环-每次迭代,新选择的整数的+-10个整数被添加到概率列表中,分配概率为0,但在我看来这不是最佳解决方案......)
例如:

myseries = list(range(1000))
n = 30 
blockRange = 10
np.random.choice(myseries, n, replace=False)

字符串
这将返回30个数字,其中两个是33和37 -但我想“禁止”这一点(如果有33,则不允许24到42之间的数字!)
谢谢

4zcjmb1e

4zcjmb1e1#

一个解决方案是迭代地构建它,它肯定会比numpy方法慢,但我找不到一种方法来用numpy实现特定的随机分布。
我创建了一个res列表和一个forbidden集合。
我重复n次(这里是n=30),尝试计算一个特定范围内的随机数。如果它不是 * 禁止的 *,意味着这个数不在forbidden集合中,我可以将它添加到res列表中。
我还将这个范围内的每个int添加到forbidden集合中:[rand_num-9; rand_numb[
但是如果它在我的forbidden集合中,我会通过while循环重试,以找到合适的随机数。
验证码:

import random 

n, lower_bound, upper_bound = 30, 0, 1000
res = []
forbidden = set()
for _ in range(n):
    rand_numb = random.randint(lower_bound, upper_bound)
    while rand_numb in forbidden:
        rand_numb = random.randint(0,1000)
    res.append(rand_numb)
    forbidden = forbidden.union(set(range(rand_numb-9, rand_numb+10)))

字符串

5sxhfpxr

5sxhfpxr2#

一个技巧可以是在数字之间生成随机空间,并将其规范化以保持在给定范围内。
以下是我使用的代码:用途:

def space_random_opt(n, lower_bound, upper_bound, space):
    range_n = upper_bound-lower_bound 
    assert range_n >=space*n, "sample too tiny"    #check if sample is large enough
    coeffs = np.random.rand(n) #generate coefficients of spacing
    spacer = (range_n-n*space)/np.sum(coeffs) #normalize coeffs
    spacerz = (spacer*coeffs)+space #get distances
    idx = np.cumsum(spacerz).astype(int) #get indices
    return idx

字符串

相关问题