2015-01-19 4 views
0

순열 행렬의 생성 속도를 높이는 코드를 찾고 있습니다. 즉, 각 열 값이 m 값을 반복하면서 각 행에 n^m 조합을 만드는 n 열의 행렬을 만들고 싶습니다.numpy 배열/행렬 값의 순열

1 1 1 1 1 1 1 
1 1 1 1 1 1 2 
1 1 1 1 1 1 3 
1 1 1 1 1 1 4 
1 1 1 1 1 1 5 
1 1 1 1 1 2 1 
... 
5 5 5 5 5 5 5 

문제가되지 않는 행의 순서 만, 아래의 예에서 유사한 매트릭스를 만들고 2이 경우의 행렬을 생성하는 방법, N = 7, m = 5가있다 모든 조합이 만들어집니다. 다음 두 가지 방법으로 배열을 만들었지 만 metod1은 매우 느리고 (이해하기 쉽지만 매우 자세하지만) num2 함수를 사용하면 method2가 빠릅니다. 그러나 매트릭스를 만들려면 더 빠른 방법론을 찾아야합니다.

import numpy as np 

############################################ 
def permArray_meth1(): 

    allArray = np.zeros((1,7)) 

    for a1 in range(1,6): 
     for a2 in range(1,6): 
      for a3 in range(1,6): 
       for a4 in range(1,6): 
        for a5 in range(1,6): 
         for a6 in range(1,6): 
          for a7 in range(1,6): 

           allArray = np.append(allArray, np.array([a1,a2,a3,a4,a5,a6,a7]).reshape(1,7), axis=0) 

    allArray = np.delete(allArray, 0, 0) 
    return allArray 

############################################ 
def permArray_meth2(): 

    ##### Create permutation matrix ##### 
    a = np.arange(np.power(5,7)).reshape(5,5,5,5,5,5,5) 
    allArray = [(a1,a2,a3,a4,a5,a6,a7) for a1,a2,a3,a4,a5,a6,a7 in np.ndindex(a.shape)] 

    ##### Convert list to array ##### 
    allArray = np.asarray(allArray)+1 
    return allArray 


############################################ 
if __name__ == "__main__": 

    allArray = permArray_meth1() # (50sec) 
    print 'allArray1', np.shape(allArray) 

    allArray = permArray_meth2() # (1sec) 
    print 'allArray2', np.shape(allArray) 

나는 속도가 사용되는 CPU 하드웨어에도 달려 있다는 것을 알고 있지만, 위에 표시된 비교적 빠른 코드를 찾고 있습니다.

다른 방법/코드가 있습니까? 들면

import numpy as np 

def permgrid(m, n): 
    inds = np.indices((m,) * n) 
    return inds.reshape(n, -1).T 

:

+0

매트릭스로 무엇을 하시겠습니까? 전체 행렬에 함수를 적용하거나 라인 단위로 함수를 적용하고 있습니까? – plonser

+0

@ plonser, 함수를 라인 단위로 적용하는 것입니다. – iblasi

답변

2

그런 다음 (n ** m, n) 배열로 출력 재편, np.indices()를 사용 열 1, 열 2, ..., N 열 대한 인덱스의 (n, m, m, ..., m) 배열을 작성하여이를 수행 할 수 예 :

print(permgrid(2, 3)) 

# [[0 0 0] 
# [0 0 1] 
# [0 1 0] 
# [0 1 1] 
# [1 0 0] 
# [1 0 1] 
# [1 1 0] 
# [1 1 1]] 
+0

아주 좋은 답변입니다. 나는 그 가능성에 대해 생각하지 않았다. 그것은 매트릭스를 만드는 시간을 정말로 향상시킵니다. Thks. – iblasi