【问题标题】:Are there some functions in Python for generating matrices with special conditions?Python中是否有一些函数可以生成具有特殊条件的矩阵?
【发布时间】:2019-12-13 12:12:33
【问题描述】:

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

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

【问题讨论】:

  • 0 和 1 的比例是什么意思?每行/列中的常数?另外,你能提供一个期望输出的小例子吗?

标签: python numpy matrix random probability


【解决方案1】:

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

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

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

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

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

没有损失,假设n

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 2012-11-21
    • 2018-08-11
    相关资源
    最近更新 更多