我有一个用零填充的 NxN 矩阵。现在我想添加到矩阵中,比如说,n 个和 m 个二到随机位置。即我想创建一个矩阵,其中在随机位置有一些固定数量的给定数字,并且在随机位置可能有固定数量的其他给定数字。我该怎么做呢?
在 Matlab 中,我会通过使用 randperm() 对矩阵索引进行随机排列,然后用 1 填充矩阵的 randperm 给出的第 n 个第一个索引,然后用 2 填充 m 下一个索引。
您可以使用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))
会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。
要生成元素的索引,用于添加 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)))