在Pyhton中创建具有特定条件的矩阵

时间:2019-10-07 12:27:28

标签: python arrays

我想知道存在多少个平方二进制矩阵,条件是它们每行和每列有两个,而且主对角线的元素为零。 我想创建一个程序,给定矩阵的大小,可以计算出满足这些条件的数量。

这是我目前一直在做的事情,但是没有得出正确的计算结果。在3x3矩阵中,我有3种可能性,而只有1种。我认为同一矩阵要被计数多次。 我该怎么做? 谢谢

import numpy as np

def funcion(n):
    total = 0
    for i in range(n):
        a = np.random.randint(0, 2, (n, n))
        while a[i].sum() != 2 or a[:, i].sum() != 2 or a[i][i] != 0:
            a = np.random.randint(0, 2, (n, n))
        if a[i].sum() == 2 and a[:, i].sum() == 2 and a[i][i] == 0:
            total = total + 1

    print(total)
    return total

2 个答案:

答案 0 :(得分:0)

随机是正确的-正如所评论的,这是一个数学问题:

nums = re.findall(r'\d{4}[-_]?\d{2}', 'Total revenue for 2016-03 is 3000 €')
# nums = ['2016-03']
nums = [num.replace('-', '').replace('_', '') for num in nums]
# nums = ['201603']

答案 1 :(得分:0)

这是一个非常直观的解决方案,您甚至可以打印出矩阵行并亲自查看。 代码的第一部分设置矩阵的规范。 这里的问题是将[1,1,0]或[1,1,1]视为乐高积木,以构建矩阵。 然后,您可以尝试使用此块的所有可能组合来填充矩阵, 始终在对角线处留下0的空间。

在注释行中,您可以验证一些行打印,以了解我们在做什么以及为什么。 唯一特殊的情况是大小为3的矩阵,因为它与“乐高积木”的大小相同,这意味着 变量“ x”为0,由于对角线,其位置固定。 结果是howMany中的值。

    import itertools
    size        = 4 #square matrix (mandatory diagonal case)
    binary_data = [1,1,'x'] #'x' can be either '0' or '1'
    changePos   = (size - 1) #1 is 0 fixed

    if size > 3 :

        comb = list(itertools.permutations(binary_data,changePos))
        rowsX = [list(i) for i in comb] #convert tuple into lists
        #[[1, 1, 'x'], [1, 'x', 1], [1, 1, 'x'], [1, 'x', 1], ['x', 1, 1], ['x', 1, 1]]

        # for 0
        rows0  = [[0 if y == 'x' else y  for y in x] for x in rowsX]
        #[[1, 1, 0], [1, 0, 1], [1, 1, 0], [1, 0, 1], [0, 1, 1], [0, 1, 1]]

        # for 1
        rows1  = [[1 if y == 'x' else y  for y in x] for x in rowsX]
        #[[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]]

        rows = []
        # all possible combinations, without repetition
        for row0 in rows0:
            if row0 not in rows:
                rows.append(row0)
            for row1 in rows1:
                if row1 not in rows:
                    rows.append(row1)
        #[[1, 1, 0], [1, 1, 1], [1, 0, 1], [0, 1, 1]]
        # 1st row can be [0,1,1,0] or [0,1,1,1] or [0,1,0,1] or [0,0,1,1]
        # 2nd row can be [1,0,1,0], [1,0,1,1], [1,0,0,1], [0,0,1,1]]

        howMany = len(rows)**size

    elif size == 3

        howMany = 1 #only one possible matrix
        """
        0,1,1
        1,0,1
        1,1,0
        """

    else: # < 3
        print('It doesn't comply the matrix specifications' )