使用 Numpy 行和列总和为 1 的随机二进制矩阵
Random Binary Matrix where Rows and Columns Sum to 1 using Numpy
我想使用 NumPy 生成随机 n x n
二进制矩阵,其中:
- 每个值为
0
或 1
- 每一行总和为
1
- 每列总和为
1
例如,有效矩阵可能是
[[1 0 0]
[0 0 1]
[0 1 0]]
无效的是
[[1 0 0]
[0 0 1]
[0 0 1]]
我尝试执行以下操作,但我无法弄清楚如何使用唯一索引随机排列每列中的值。如何生成符合上述约束条件的矩阵?
N = 10
a = np.zeros((N,N))
a[0,:] = 1
创建一个 n
by n
单位矩阵,然后打乱所有行。单位矩阵是一个二进制矩阵,其中每行和每列总和为 1,并且打乱行保留此 属性:
n = 5
result = np.identity(n)
np.random.shuffle(result)
print(result)
这将输出如下内容:
[[0. 1. 0. 0. 0.]
[0. 0. 0. 0. 1.]
[0. 0. 0. 1. 0.]
[1. 0. 0. 0. 0.]
[0. 0. 1. 0. 0.]]
使用 np.random.permutation
to create random column indices and then use advanced indexing 用 1 填充索引:
N = 10
a = np.zeros((N,N), dtype=int)
a[np.arange(N), np.random.permutation(N)] = 1
a
array([[0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]])
我想使用 NumPy 生成随机 n x n
二进制矩阵,其中:
- 每个值为
0
或1
- 每一行总和为
1
- 每列总和为
1
例如,有效矩阵可能是
[[1 0 0]
[0 0 1]
[0 1 0]]
无效的是
[[1 0 0]
[0 0 1]
[0 0 1]]
我尝试执行以下操作,但我无法弄清楚如何使用唯一索引随机排列每列中的值。如何生成符合上述约束条件的矩阵?
N = 10
a = np.zeros((N,N))
a[0,:] = 1
创建一个 n
by n
单位矩阵,然后打乱所有行。单位矩阵是一个二进制矩阵,其中每行和每列总和为 1,并且打乱行保留此 属性:
n = 5
result = np.identity(n)
np.random.shuffle(result)
print(result)
这将输出如下内容:
[[0. 1. 0. 0. 0.]
[0. 0. 0. 0. 1.]
[0. 0. 0. 1. 0.]
[1. 0. 0. 0. 0.]
[0. 0. 1. 0. 0.]]
使用 np.random.permutation
to create random column indices and then use advanced indexing 用 1 填充索引:
N = 10
a = np.zeros((N,N), dtype=int)
a[np.arange(N), np.random.permutation(N)] = 1
a
array([[0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]])