python - 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 方法来更快地解决这个问题。
解决方案
对于这些参数值,遇到重复行的概率是天文数字的小(除非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
行。
推荐阅读
- javascript - 使用 Fetch API 的 javascript HTTP GET 返回 401 Unauthorized 但在 Postman 中有效
- java - 从不同长度的用户字符串中读取到数组中
- oop - 状态机、封装和 OOP 设计
- javascript - ExceptionsManager.js:84 未处理的 JS 异常:ReferenceError:未定义响应
- postgresql - 如何在 PostgreSQL 中跳过 psql \COPY 中的空行
- sql - 将数据从列转换为行,仅当列的并集不为空时才选择,使用 where 子句检查不为空和 != ''
- node.js - 如何将 nodemon 用于 eslint 和 babel
- python-3.x - 将图像放在另一个图像之上的更有效方法 - OpenCV Python3
- asp.net-core - ASP.NET Core 静态文件返回为 Base64 编码
- react-native - jest-haste-map:观看错误,抱怨在 jest-haste-map node_modules 文件夹中找不到文件