Numpy isin() 计算重复元素

问题描述 投票:0回答:1

背景故事

我正在编写一个脚本来模拟掷骰子。 (目前有 n x 6 面骰子)

卷是使用

np.random.randint(low=1, high=6, size=n)
线完成的,效果很好。例如生产:

[1,4,5,2,4,4]

对于每一卷,我想检查是否存在某些骰子组合,例如

  • 6个三:
    [3,3,3,3,3,3]
  • 3个四:
    [4,4,4]
  • 每个数字正好 1:
    [1,2,3,4,5,6]

如果根据这三种组合检查掷骰结果,结果将分别为

False
True
False

问题

检查一卷 n 个骰子是否包含给定的骰子组合的最有效方法是什么:

  1. 可以有重复的数字(例如 3 个二,或 4 个五)
  2. 可以是 2 到 n 之间的任意长度(即所有骰子或只是其中的一些)

我尝试过创建

set
,并使用
numpy
isin()
in1d()
,但是,据我所知,这些方法都无法识别重复数字的组合。如果你检查卷中是否有 3 个四,那么它只会检查前四个 3 次,并且有 1 或 2 个四的卷仍然会被标记
True

任何帮助将不胜感激,谢谢!

numpy random
1个回答
0
投票

我会用

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
© www.soinside.com 2019 - 2024. All rights reserved.