首页 > 解决方案 > Numpy 随机选择具有生成具有唯一行的二维数组的概率

问题描述

Numpy 随机选择生成具有所有唯一值的二维数组类似,我正在寻找一种有效的生成方式:

n = 1000
k = 10
number_of_combinations = 1000000

p = np.random.rand(n)
p /= np.sum(p)

my_combinations = np.random.choice(n, size=(number_of_combinations, k), replace=False, p=p)

正如在上一个问题中所讨论的,我希望这个矩阵只有唯一的行。不幸的是,所提供的解决方案不适用于使用特定概率 p 的额外扩展。

我目前的解决方案如下:

my_combinations = set()

while len(my_combinations) < number_of_combinations:
    new_combination = np.random.choice(n, size=k, replace=False, p=p)
    my_combinations.add(frozenset(new_combination))

print(my_combinations)

但是,我确实认为应该有一种更有效的 numpy 方法来更快地解决这个问题。

标签: pythonnumpy

解决方案


对于这些参数值,遇到重复行的概率是天文数字的小(除非p非常偏斜,可能到了浮点精度无法适应的程度)。我会用

my_combinations = np.random.choice(n, size=number_of_combinations, k), replace=True, p=p)

O(N log N)您可以在where中检查重复项N = number_of_combinations

保守地说,你可以生成

my_combinations = np.random.choice(n, size=2 * number_of_combinations, k), replace=True, p=p)

然后删除重复项并获取第一number_of_combinations行。


推荐阅读