生成 mxn 二进制数组矩阵的最有效方法是什么,该矩阵被限制为每列的总和等于 0 或 1?
像这样
[[0,0,1,0,0],
[1,1,0,0,0],
[0,0,0,0,1]
[0,0,0,0,0]]
m 和 n 将是固定的,但 n 大于 500000,因此迭代方法可能需要很长时间才能找到合适的矩阵。
最佳答案
您正在选择列的随机子集,然后为每一列随机选择一行。这是使用 numpy 执行此操作的一种方法。二项式分布用于选择哪些列获得 1。更改 numpy.random.binomial
的第二个参数以调整具有 1 的列的密度。
In [156]: m = 5
In [157]: n = 12
In [158]: a = np.zeros((m, n), dtype=int)
In [159]: cols = np.random.binomial(1, 0.7, size=n)
In [160]: a[np.random.randint(0, m, size=cols.sum()), np.nonzero(cols)[0]] = 1
In [161]: a
Out[161]:
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0],
[1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0]])
如果您希望每个 列中有一个 1,这里有一个相当简洁的方法:
In [103]: m = 5
In [104]: n = 12
In [105]: a = (np.random.randint(0, m, size=n) == np.arange(m).reshape(-1, 1)).astype(int)
In [106]: a
Out[106]:
array([[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1],
[0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
np.random.randint(0, m, size=n)
是行索引的随机选择,每列一个。 np.arange(m).reshape(-1, 1)
是序列 [0, 1, ..., m-1]
存储在一个具有形状的数组中(米,1)。将其与随机值进行比较时,将应用广播,因此会创建一个形状为 (m, n) 的 bool 数组。只需将其转换为整数,即可得到结果。
关于python - 在python中生成条件随机二进制数组矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41151305/