我有一个用零填充的NxN矩阵。现在我想添加到矩阵,比如n个和m两个到随机位置。即我想创建一个矩阵,其中在随机位置存在一定数量的给定数量,并且可能在随机位置具有固定数量的其他给定数量。我该怎么做?
在Matlab中,我会通过用randperm()对矩阵索引进行随机排列,然后填充矩阵的randperm给出的n个第一个索引,其中包括1和m,接下来是两个。
答案 0 :(得分:3)
您可以使用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))
答案 1 :(得分:2)
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.]])
这里我们创建一个随机排列,然后将从a
中的排列取得的前10个索引设置为1,然后将接下来的10个索引设置为2。
答案 2 :(得分:0)
要生成添加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)))