Sign up ×
Code Review Stack Exchange is a question and answer site for peer programmer code reviews. It's 100% free, no registration required.

It has been a very long time since I've used Python.

What I'm looking for: I would like to create a 6-by-6 random matrix where each component is either 1 or 2, so that there are 18 ones and 18 twos.

Attempt:

import numpy
import random

array = numpy.zeros((6, 6))
while (array == 1).sum() != 18 or (array == 2).sum() != 18: 
    for i in range(0, 6):
        for j in range(0, 6):
            array[i][j] = random.randint(1, 2) 
print array    

Sure, this works. But this seems to me to be extremely inefficient, as the code is literally having to insert new matrix values until the number of ones/twos is 18. How can I make this more efficient?

share|improve this question

1 Answer 1

up vote 13 down vote accepted

Just create a list of 18 ones and 18 twos, shuffle it, then reshape to 6x6:

from random import shuffle
from numpy import reshape

nums = [1]*18 + [2]*18
shuffle(nums)
arr = reshape(nums, (6, 6))

Produces (for example):

array([[1, 2, 2, 1, 2, 1],
       [2, 2, 2, 2, 2, 1],
       [2, 2, 2, 1, 1, 2],
       [1, 1, 1, 1, 2, 2],
       [2, 1, 1, 2, 1, 1],
       [1, 2, 1, 1, 1, 2]])
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.