给定矩阵n x nCr,找到唯一组合的布尔矩阵:
对于n x n,这很简单,唯一组合的布尔矩阵:
[['AA', 'AB', 'AC'],
['BA', 'BB', 'BC'],
['CA', 'CB', 'CC']]
n = 3时的唯一组合是:
> mask = np.arange(3)[:, np.newaxis] < np.arange(3)
array([[False, True, True],
[False, False, True],
[False, False, False]])
好吧,现在当n = 7且r = 2且n x nCr矩阵:
AB AC AD AE AF AG BC BD BE BF BG CD CE CF CG DE DF DG EF EG FG <- 7C2
A 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
B 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
C 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
D 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
E 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
F 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
G 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
我正在尝试找到一种方法,当n = 7和c = 2时,找到一个布尔值的7x21(即7x7C2)矩阵,其中真值在正确的位置。即在给我ABC,ACD,ABE,ABF ... EFG的地方
显然这不是三角形,但是我可以应用什么功能,以便我可以创建一个掩码,该掩码返回正确的布尔值的7x21矩阵。
我实际上正在处理> 50种组合,因此理想情况下,我不会构建21x21矩阵,然后切出不需要的部分,因为这是一个非常敏感的问题。
[经过一番尝试后,我想到了:
import numpy as np
from scipy.special import comb
def comb_upper_triangular(n, r):
k = comb(n, r, exact=True)
ut = np.zeros((n, k), dtype=int)
i = 0
while n - i - 1 >= r:
ut[i, -comb(n - i - 1, r, exact=True):] = 1
i += 1
return ut
因此,对于comb_upper_triangular(7, 2)
,我们得到:
array([[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])