在n x nCr矩阵中查找上三角形

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

给定矩阵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矩阵,然后切出不需要的部分,因为这是一个非常敏感的问题。

python numpy matrix numpy-ndarray array-broadcasting
1个回答
0
投票

[经过一番尝试后,我想到了:

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