python - Python中是否有一些函数可以生成具有特殊条件的矩阵?
问题描述
我正在 Python 上编写数据集生成器,但遇到以下问题:我需要一组没有空列/行的零一矩阵。零和一之间的比率也应该是恒定的。
我尝试使用固定比例的零和具有以下重塑的零一列表来洗牌,但是对于具有数百行/列的矩阵来说,它太长了。我还考虑到我无法实现某些输入,例如具有 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
我们首先观察到一个 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 个,这是不可能的。
推荐阅读
- java - 如何从队列目的地获取消息?
- python - Numpy 将整数数组保存为浮点数组
- css - CSS - 仅显示第二个 ul 的最后一个 li
- java - 肥皂错误类型:java.lang.ClassCastException
- javascript - Webpack 图像加载器和 Rails
- c# - 未找到自定义 C# 属性的命名空间
- ruby-on-rails - 502 Bad Gateway - Rails 应用程序、Puma、Capistrano、Nginx
- html - 在 bootstrap4 中显示容器后面的图像
- python - 将folium与本地保存的瓷砖一起使用,奇怪的行为
- excel - 宏上的源数据以在创建的数据透视表上的数据行更改时选择所有活动单元格