Skip to main content
 首页 » 编程设计

python之在python中生成条件随机二进制数组矩阵

2025年05月04日15kevingrace

生成 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 数组。只需将其转换为整数,即可得到结果。