I need to generate an 3xn matrix having random columns ensuring that each column does not contain the same number more than once. I am currently using the below code:
n=10
set = np.arange(0, 10)
matrix = np.random.choice(set, size=3, replace=False)[:, None]
for i in range(n):
column = np.random.choice(set, size=3, replace=False)[:, None]
matrix = np.concatenate((matrix, column),axis=1)
print matrix
which gives the output I expected:
[[2 1 7 2 1 9 7 4 5 2 7]
[4 6 3 5 9 8 1 3 8 4 0]
[3 5 0 0 4 5 4 0 2 5 3]]
However, it seems that the code does not work fast enough. I am aware that implementing the for loop using cython might help, but I want to know that is there any more performant way to write this code solely in python.
nbe in your actual application?matrix = np.concatenate((matrix, column),axis=1)inside the loop. Build a python list of columns, and then convert the list of columns to an array after the loop. Appending to a python list is much more efficient than repeatedly concatenating numpy arrays.