背景故事
我正在编写一个脚本来模拟掷骰子。 (目前有 n x 6 面骰子)
卷是使用
np.random.randint(low=1, high=6, size=n)
线完成的,效果很好。例如生产:
[1,4,5,2,4,4]
对于每一卷,我想检查是否存在某些骰子组合,例如
[3,3,3,3,3,3]
[4,4,4]
[1,2,3,4,5,6]
如果根据这三种组合检查掷骰结果,结果将分别为
False
、True
、False
。
问题
检查一卷 n 个骰子是否包含给定的骰子组合的最有效方法是什么:
我尝试过创建
set
,并使用numpy
的isin()
和in1d()
,但是,据我所知,这些方法都无法识别重复数字的组合。如果你检查卷中是否有 3 个四,那么它只会检查前四个 3 次,并且有 1 或 2 个四的卷仍然会被标记 True
。
任何帮助将不胜感激,谢谢!
Counter
:
from collections import Counter
a = np.array([1,4,5,2,4,4])
comb = np.array([4,4,4])
c_a = Counter(a)
c_comb = Counter(comb)
c_comb <= c_a
# True
如果您想受益于 numpy 的速度,您可以利用
numpy.unique
来执行计数:
from collections import Counter
a = np.array([1,4,5,2,4,4])
comb = np.array([4,4,4])
c_a = Counter(dict(zip(*np.unique(a, return_counts=True))))
c_comb = Counter(dict(zip(*np.unique(comb, return_counts=True))))
c_comb <= c_a
# True