首页 > 解决方案 > Python中是否有一些函数可以生成具有特殊条件的矩阵?

问题描述

我正在 Python 上编写数据集生成器,但遇到以下问题:我需要一组没有空列/行零一矩阵。零和一之间的比率也应该是恒定的。

我尝试使用固定比例的零和具有以下重塑的零一列表来洗牌,但是对于具有数百行/列的矩阵来说,它太长了。我还考虑到我无法实现某些输入,例如具有 9 个单元素的 3*10 矩阵,并且某些输入只能具有像具有 10 个单元素的 10*10 矩阵这样的解决方案。

标签: pythonnumpymatrixrandomprobability

解决方案


如果我理解这个任务,这样的事情可能会起作用:

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

我们首先观察到一个 nxm 矩阵可以用 k 个 st 相等的比率填充,只有 k 可以被 n 和 m 整除。

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

对于每一行,我们存储一组列 st mat[row, column] = 1(最初为空)。我们现在可以遍历每一行 k/n 次,从双端队列中选择下一列 st mat[row, column] = 0 并将 mat[row, column] 设置为 1。

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


推荐阅读