我有一段代码:
V = numpy.floor(3*np.random.rand(5,5))
print V
它在5x5表中创建数组的随机结果,如何添加条件" 1"只产生x次," 2"只产生y次,否则是" 0"。 感谢
答案 0 :(得分:1)
试试这个:
import numpy as np
def newArray( x, y, n):
if x + y > n ** 2:
print "Values error!"
return
res = [[0 for col in range(n)] for row in range(n)]
# Create roulette
roulette = range(0, n ** 2)
printkxtimes(res, roulette, 1, x, n)
printkxtimes(res, roulette, 2, y, n)
print res
# This function draws random element from roulette,
# gets the position in array and sets value of this position to k.
# Then removes this element from roulette to prevent drawing it again
def printkxtimes(array, roulette, k, x, n):
for i in xrange(0, x):
r = int(np.floor(roulette.__len__()*np.random.rand(1))[0])
array[roulette[r] / n][roulette[r] % n] = k
roulette.pop(r)
newArray(10,2,5)
roulette
的一点解释:
表res
的每个元素都可以用range(0, n^2)
中的数字等效表示:
z = row*n + column <=> row = int(z/n) , column= z%n
然后,我们可以将表格res
中的排名列表表示为[0,1,...,n^2-1]
答案 1 :(得分:1)
以下情况如何?
import numpy as np
shape = (5, 5)
area = shape[0] * shape[1]
np.random.permutation([1]*x + [2]*y + [0]*(area-x-y)).reshape(shape)
看起来很简单。你随机排列[1, ... 1, 2, ... 2, 0, ... 0]
,然后你就把它变成一个正方形。我不太确定,但它的计算成本也不那么高,并且可以很容易地扩展到n
数字或维度。