2016-08-26 4 views
0

임의의 열을 갖는 3xn 행렬을 생성해야 각 열에 동일한 번호가 두 번 이상 포함되지 않습니다. 내가 기대 출력을 제공임의의 열에서 두 번째 numpy 배열 생성

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 

:

[[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]] 

그러나,이 코드가 충분히 빠르게 작동하지 않는 것 같습니다 저는 현재 아래의 코드를 사용하고 있습니다. 나는 cython을 사용하여 for 루프를 구현하는 것이 도움이 될 수 있다는 것을 알고 있지만, 파이썬에서이 코드를 작성하는 데 더 좋은 방법이 있는지 알고 싶습니다.

+0

얼마나 큰 의지'실제 응용 프로그램에서 수 n'? –

+0

루프 내부에서'matrix = np.concatenate ((matrix, column), axis = 1)'을하지 마십시오. 열의 파이썬 목록을 작성한 다음 루프 다음에 열 목록을 배열로 변환하십시오. 파이썬리스트에 추가하는 것은 numpy 배열을 반복적으로 연결하는 것보다 훨씬 효율적입니다. –

답변

1

당신은 (아마도이 ​​issue에) 파이썬의 임의 모듈과 그것을 더 속도를 높일 수 :

import random 
np.array([random.sample(range(10), 3) for _ in range(n)]).T 

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 
0

메모에서 이미 언급했듯이 numpy 어레이에 반복적으로 연결하면 좋지 않은 생각입니다. 메모리를 많이 할당해야하기 때문입니다. 이미 결과 배열의 최종 크기를 알고, 당신은 단지 시작에 할당 한 후 바로 열 반복 수 :

matrix = np.empty((3, n), dtype=np.int) 
for i in range(n): 
    matrix[:, i] = np.random.choice(10, size=3, replace=False) 

이 적어도 내 컴퓨터에,이보다 이미 6 배 빠른 당신의 번역.

관련 문제