Generating 2d numpy arrays from random columns
<p>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:</p>

<pre><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
</code></pre>

<p>which gives the output I expected:</p>

<pre><code>[[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]]
</code></pre>

<p>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.</p>

<p>You can speed it up further with Python's random module (probably due to this <a href="https://github.com/numpy/numpy/issues/2764" rel="nofollow">issue</a>):</p>

<pre><code>import random
np.array([random.sample(range(10), 3) for _ in range(n)]).T
</code></pre>

<hr>

<pre><code>n = 10**6

%timeit t = np.array([random.sample(range(10), 3) for _ in range(n)]).T
1 loop, best of 3: 6.25 s per loop

%%timeit
matrix = np.empty((3, n), dtype=np.int)
for i in range(n):
    matrix[:, i] = np.random.choice(10, size=3, replace=False)
1 loop, best of 3: 19.3 s per loop
</code></pre>

python numpy