在零矩阵

时间:2017-04-30 05:43:21

标签: python numpy

我正在寻找一种方法来生成n 1&n的nXn矩阵的所有组合,其他所有位置都包含0' s。例如,如果我从3x3零矩阵开始

dim = 3
m = np.zeros((dim, dim), dtype=np.int)
  • 如果n为0,则有1种可能的表示形式。
  • 如果n为1,则有9个表示。
  • 如果n为2,则有72(9 * 8)个表示。

也就是说,如果n是i,则有(暗淡*暗淡)!/((暗淡*暗淡) - i)!表示。

似乎生成n 1 * dim * dim矩阵的生成器解决方案采用 dim n 参数并生成(dim *)昏暗)!/((暗淡*暗淡) - i)!陈述。

1 个答案:

答案 0 :(得分:2)

这是这些矩阵的生成器:

import numpy as np
from itertools import combinations

def generate_representations(dim, n, dtype=int):
    assert n <= dim * dim

    for ind in combinations(range(dim * dim), n):
        mat = np.zeros(dim * dim, dtype=dtype)
        if ind:
            mat[np.array(ind)] = 1
        yield mat.reshape(dim, dim)

它返回一个唯一dim x dim矩阵的生成器,其中的条目由n个组成,其余条目为零。

请注意,对于dim=3n=2,它会正确删除重复项并返回36个结果(9 * 8 / 2),而不是您在问题中指出的72个结果:

mats = list(generate_representations(3, 2))
len(mats)
# 36

mats[10]
# array([[ 0.,  1.,  0.],
#        [ 0.,  1.,  0.],
#        [ 0.,  0.,  0.]])