【问题标题】:Random numpy array in order按顺序排列的随机 numpy 数组
【发布时间】:2019-03-19 11:26:26
【问题描述】:

我有如下随机抽样方法:

def costum_random_sample(size):
    randomList = []
    counter = 0
    last_n = -1
    while(size != counter):
        n = random.random()
        if abs(n - last_n) < 0.05:
            continue
        else:
            randomList.append(n)
            counter += 1
            last_n = n

    return np.array(randomList) 

结果是这样的数组([0.50146945, 0.17442673, 0.60011469, 0.13501798])。现在,我想更改它以使其按升序排列。 Sort() 在这种情况下不起作用,因为它在生成后更改了我的数组的顺序,并且更改了每个数字之间的逻辑。我希望它按顺序随机排列列表中的数字,这样它可以保持数字序列中的逻辑。我该怎么做?

【问题讨论】:

    标签: python numpy matrix random


    【解决方案1】:

    如果您的数组很短,您可以简单地生成整个数组,对其进行排序,然后拒绝它并在违反约束时重新生成。

    bad = True
    while bad:
        arr = np.sort(np.random.rand(size))
        bad = np.any(np.ediff1d(arr) < 0.05)
    

    如果size 太大,冲突就会太多,而且这将永远持续下去,所以只有在有合理的机会随机生成一致数组时才使用它。请注意,如果size &gt; 20 没有符合条件的数组,则会将其变成无限循环。

    另一种方法是按上述方式生成数组并对其进行排序,找到不一致的元素对,然后通过增加不一致对之间的距离并平均减去与其他位置的差异来微调数组元素。这不会陷入无限循环,但有更多的数学运算,并且会弯曲均匀分布(虽然我不能告诉你多少)。

    编辑经过一番思考,有一个更好的方法。基本上,您需要一个间隔数组,其中有一个固定的间隔符和每个元素之间的一点额外随机性:

    random start space
    [element1]
    0.05 spacer
    some more space
    [element2]
    0.05 spacer
    some more space
    [element3]
    random end space
    

    所有空间需要加起来为1。但是,其中一些空间是固定的((size - 1) * 0.05);所以如果我们去掉固定的间隔,我们就有了“空间预算”来分配我们的开始、结束和随机空间。所以我们生成随机空间,然后稍微打孔,这样它就可以总结为我们的空间预算。然后添加固定间隔,累积总和将为我们提供最终的数组(最后还有一个额外的1.0,我们将其砍掉)。

    space_budget = 1 - (size - 1) * 0.05
    space = np.random.rand(size + 1)
    space *= space_budget / np.sum(space)
    space[1:-1] += 0.05
    arr = np.cumsum(space)[:-1]
    

    对于size = 21,您每次只得到一个解,因为space_budget 为零。对于较大的size,您会开始突破 0...1 范围,因为在该区间中填充超过 21 个 0.05 间隔在数学上是不可能的。

    【讨论】:

    • 是的,我明白了。实际上我尝试了一些方法,但它陷入了无限循环,因为我的数组有 20 个元素
    • 哦,酷。我明白了你的想法。它看起来比我现在正在做的要好。我会试试的。
    猜你喜欢
    • 2012-11-19
    • 1970-01-01
    • 2016-10-03
    • 2011-06-18
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 2016-07-12
    相关资源
    最近更新 更多