NumPy随机选择保持原始顺序

3

假设我们有一个数组a = [5, 2, 3, 8, 4, 1, 9]

我想选择几个元素(不重复),使得所选元素的相对顺序与输入数组中的顺序相同。 使用random.choiceshuffle=False似乎无法实现这一点。

a = [5, 2, 3, 8, 4, 1, 9]
rng = np.random.default_rng(42)
rng.choice(a, 4, replace=False, shuffle=False)

输出:

array([9, 5, 1, 8])

我想看:

array([5, 8, 1, 9])

这个结果最简单的方法是什么?

原始列表可以有重复项吗? - Barmar
1
否则,使用random.choices()获取选择,然后使用sort()将其恢复为原始顺序。 - Barmar
从原始列表中随机选择一个元素。对于下一个随机元素,从原始列表的切片版本中选择一个从前一个随机元素的索引+1开始的随机元素。重复此过程。 - Paul M.
@PaulM.:如果你不仔细选择权重,那么它会产生严重偏斜的概率分布。 - user2357112
@PaulM。那可能行不通——如果你选择列表的最后一个元素,就没有更多可以选择的了。 - Barmar
2个回答

3
我可以尝试一种方法,先随机选择索引,然后根据这组索引筛选原始列表:
import random

a = [5, 2, 3, 8, 4, 1, 9]

idx = set(random.sample(range(len(a)), k=4))
output = [x for i, x in enumerate(a) if i in idx]

print(output) # [5, 2, 3, 1]

使用相同的思路下numpy库,

import numpy as np
from numpy.random import default_rng

a = np.array([5, 2, 3, 8, 4, 1, 9])

output = a[sorted(default_rng().choice(range(len(a)), size=4, replace=False))]
print(output) # [5 3 4 9]

0

随机选取 k 个元素,并根据在 lst 中的索引对结果进行排序:

import random

def select_k_sorted(lst, k):
    return sorted(random.sample(lst, k), key=lst.index)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接