Rikudo Pain Rikudo Pain - 8 months ago 48
Python Question

Add Condition on generated numpy

I have piece of code :

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

It create random result of array in 5x5 table, how to add condition "1" only generate x times, "2" only generate y times, else are "0".

Answer Source

Try this:

import numpy as np

def newArray( x, y, n):
    if x + y > n ** 2:
        print "Values error!"
    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


A little explanation of roulette :

Every element of table res can be represented equivalently with a number from range(0, n^2) :

z = row*n + column <=> row = int(z/n) , column= z%n

We can then represent the list of positions in table res as the table [0,1,...,n^2-1]