gpt4 book ai didi

arrays - 生成大量随机卡牌 - NumPy

转载 作者:行者123 更新时间:2023-12-02 21:06:56 24 4
gpt4 key购买 nike

我需要生成大量随机扑克牌。速度很重要,因此一切都必须采用 numpy 矩阵形式。

我知道我可以从一副牌中生成两张牌,如下所示:

np.random.choice(12*4,2, replace=False)

如何执行相同的查询以便在不使用 for 循环的情况下创建二维数组?困难在于每一轮都需要从原始堆栈中进行分配,因此替换仅对于行为 true,而对于列为 False。

我也尝试过

originalDeck=np.arange(1,12*4)
np.random.shuffle(originalDeck)

但是这里我们也需要生成originalDeck的二维数组,然后生成每一行?这可能吗?

最佳答案

由于您只寻找一对卡片,因此您只有 1128 可能的对(没有替换),因此您可以生成所有对,然后从该组中随机选择卡片:

from itertools import combinations
# There may be a better way to generate all possible pairs in numpy,
# but I am not aware of and this is pretty fast for this size
all_pairs = np.array(list(combinations(range(12 * 4), 2)))
cards = all_pairs[np.random.randint(all_pairs.shape[0], size = N_PAIRS), :]

其中 N_PAIRS 是您想要的对数。

基准:

In [55]: # Input params
...: N = 1000000 # Number of queries
...: M = 2 # Number of cards to be picked
...:
...: def original_app(N,M):
...: out = np.empty((N,2),dtype=int)
...: for i in range(N):
...: out[i] = np.random.choice(12*4,M, replace=False)
...: return out
...:
...: def vectorized_app(N,M):
...: return np.argpartition(np.random.rand(N,12*4),M,axis=1)[:,:M]
...:
...: def itertools_app(N,M):
...: all_pairs = np.array(list(combinations(range(12 * 4), M)))
...: return all_pairs[np.random.randint(all_pairs.shape[0], size = N), :]

In [46]: %timeit original_app(N,M)
1 loops, best of 3: 10.8 s per loop

In [47]: %timeit vectorized_app(N,M)
1 loops, best of 3: 618 ms per loop

In [48]: %timeit itertools_app(N,M)
10 loops, best of 3: 24.8 ms per loop

M非常小时,此方法非常快,随着M变大,组合数量呈指数级增加,甚至会创建all_pairs 数组是不可能的(使用 M = 5 已有约 1700000 种可能的组合)。

关于arrays - 生成大量随机卡牌 - NumPy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35572381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com