在生成的numpy

时间:2016-12-01 10:37:56

标签: python numpy

我有一段代码:

V = numpy.floor(3*np.random.rand(5,5))
print V

它在5x5表中创建数组的随机结果,如何添加条件" 1"只产生x次," 2"只产生y次,否则是" 0"。 感谢

2 个答案:

答案 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数字或维度。