随机二进制矩阵,其中行和列使用numpy总和到1

发布于 2025-01-18 11:37:46 字数 530 浏览 0 评论 0原文

我想使用numpy生成一个随机nx 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

I want to generate a random n x n binary matrix using NumPy, where:

  • each value is either 0 or 1
  • every row sums up to 1
  • every column sums up to 1

For example, a valid matrix might be

[[1 0 0]
[0 0 1]
[0 1 0]]

while an invalid one is

[[1 0 0]
[0 0 1]
[0 0 1]]

I tried doing the following, but I couldn't figure out how to shuffle the values in each column using a unique index. How do I generate a matrix that adheres to the above constraints?

N = 10
a = np.zeros((N,N))
a[0,:] = 1

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

━╋う一瞬間旳綻放 2025-01-25 11:37:46

创建一个 n × 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.]]

Create an n by n identity matrix, and then shuffle all of the rows. The identity matrix is a binary matrix where each row and column sums to one, and shuffling the rows preserves this property:

n = 5
result = np.identity(n)
np.random.shuffle(result)
print(result)

This will output something like:

[[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.]]
梦太阳 2025-01-25 11:37:46

使用 > 创建随机列索引,然后使用高级索引用1s填充索引:

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]])

Use np.random.permutation to create random column indices and then use advanced indexing fill indices with 1s:

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]])
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文