Python 中是否有一些函数可以生成具有特殊条件的矩阵?

Are there some functions in Python for generating matrices with special conditions?

我正在 Python 上编写数据集生成器,但我遇到了以下问题:我需要一组 零一矩阵 没有空columns/rows。此外,0 和 1 之间的比率应为 常数

我试图通过以下重塑以固定的 0 和 1 的比例来打乱 0-1 列表,但是对于具有数百个 rows/cols 的矩阵来说,它太长了。我还考虑到我无法实现某些输入,例如具有 9 个单元素的 3*10 矩阵,并且某些输入只能具有解决方案,例如具有 10 个单元素的 10*10 矩阵。

如果我理解这个任务,这样的事情可能会奏效:

import numpy as np
from collections import defaultdict, deque

def gen_mat(n, m, k):
    """
    n: rows,
    m: cols,
    k: ones,
    """
    assert k % n == 0 and k % m == 0
    mat = np.zeros((n, m), dtype=int)

    ns = np.repeat(np.arange(n), k // n)
    ms = np.repeat(np.arange(m), k // m)
    # uniform shuffle
    np.random.shuffle(ms)
    ms_deque = deque(ms)

    assigned = defaultdict(set)
    for n_i in ns:
        while True:
            m_i = ms_deque.popleft()
            if m_i in assigned[n_i]:
                ms_deque.append(m_i)
                continue
            mat[n_i, m_i] = 1
            assigned[n_i].add(m_i)
            break

    return mat

我们首先观察到 n x m 矩阵可以填充 k 个 s.t。只有 k 能被 n 和 m 整除。

假设这个条件成立,每个行索引将出现 k/n 次,每个列索引将出现 m/k 次。我们打乱列索引以确保分配是随机的,并将随机列索引存储在双端队列中以提高效率。

对于每一行,我们存储一组列 s.t。垫[行,列] = 1(最初为空)。 我们现在可以循环每一行 k/n 次,选择下一列 s.t。来自双端队列的 mat[row, column] = 0 并将 mat[row, column] 设置为 1.

没有损失,假设n <= m。该算法成功终止,除非我们遇到双端队列中所有剩余列都满足 mat[row, column] = 1 的情况。这只会发生在最后一行,这意味着我们已经分配了 k/m + 1 个给一些专栏,这是不可能的。