3

我有一个用零填充的 NxN 矩阵。现在我想添加到矩阵中,比如说,n 个和 m 个二到随机位置。即我想创建一个矩阵,其中在随机位置有一些固定数量的给定数字,并且在随机位置可能有固定数量的其他给定数字。我该怎么做呢?

在 Matlab 中,我会通过使用 randperm() 对矩阵索引进行随机排列,然后用 1 填充矩阵的 randperm 给出的第 n 个第一个索引,然后用 2 填充 m 下一个索引。

4

3 回答 3

4

您可以使用numpy.random.shuffle就地随机排列数组。

>>> import numpy as np
>>> X = np.zeros(N * N)
>>> X[:n] = 1
>>> X[n:n+m] = 2
>>> np.random.shuffle(X)
>>> X = X.reshape((N, N))
于 2012-04-14T10:39:48.380 回答
3

numpy.random.permutation是你要找的吗?

你可以这样做:

In [9]: a=numpy.zeros(100)

In [10]: p=numpy.random.permutation(100)

In [11]: a[p[:10]]=1

In [12]: a[p[10:20]]=2

In [13]: a.reshape(10,10)
Out[13]: 
array([[ 0.,  1.,  0.,  0.,  0.,  2.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  2.,  0.],
       [ 0.,  2.,  0.,  0.,  0.,  0.,  2.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  2.,  0.,  2.,  1.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  0.,  2.,  0.,  0.,  0.],
       [ 0.,  2.,  0.,  2.,  0.,  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.,  0.,  0.,  2.,  0.,  0.,  0.,  1.,  0.]])

在这里,我们创建一个随机排列,然后将从排列中获取的前 10 个索引设置a为 1,然后将接下来的 10 个索引设置为 2。

于 2012-04-14T10:38:50.790 回答
1

要生成元素的索引,用于添加 1 和 2 的位置,这又如何呢?

# assuming N, n and m exist.
In [1]: import random
In [3]: indices = [(m, n) for m in range(N) for n in range(N)]
In [4]: random_indices = random.sample(indices, n + m)
In [5]: ones = random_indices[:n]
In [6]: twos = random_indices[n:]

按照 Petr Viktorin 的评论进行了更正,以便在ones和中不存在重叠索引twos

生成索引的另一种方法:

In [7]: import itertools
In [8]: indices = list(itertools.product(range(N), range(N)))
于 2012-04-14T10:20:09.283 回答