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

标签 python arrays numpy matrix random

生成 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/

相关文章:

python - 类型错误 : include and exclude must both be non-string sequences

python - 按类别过滤 Tensorflow 数据集

python - 如何获取当前的 'package' 名称? (设置.py)

javascript - 给出一个原始数组和一个新数组,每个元素的值表示左边更大的元素的数量

python - 如何从两个不同的 numpy 数组创建一个 numpy 数组?

python - python中的高效外积

带有可变十进制数说明符的 Python f 字符串

javascript - 下划线返回数组中对象的索引,其中单词存在于对象内的句子中

arrays - 在二维数组 NxN Swift 上创建、随机填充和搜索元素

python - 沿一维的 1D 数组和 3D 数组的高效乘积 - NumPy