2011-12-02 4 views
0

제 응용 프로그램에서는 행렬 행렬을 운반하는 것이 좋습니다. numpy는 그것을 좋아하지 않기 때문에 배열 작업은 대부분 가볍기 때문에 배열 배열로 끝납니다. 나는 그들에게 아주 만족합니다.배열 배열을 행렬로 변환

그것은 그 다음과 같습니다

그러나

[ [S11hh S11hv] [S12hh S12hv] ] 
    [ [S11vh S11vv] [S12vh S12vv] ] 
S = [        ] 
    [ [S21hh S21hv] [S22hh S22hv] ] 
    [ [S21vh S21vv] [S22vh S22vv] ] 

(.이는 광학의, 수평 및 수직 편광의 반사와 투과 계수입니다), 내 코드에서 어떤 시점에서 내가 필요 대신의 부분, S를 모두 사용하여 행렬 곱셈을 수행

M = S.dot(L) 
L 모습

:

내가 순진

M = S.dot(L) 

을 실행하면

[ [L1hh L1hv] ] 
    [ [L1vh L1vv] ] 
L = [    ] 
    [ [L2hh L2hv] ] 
    [ [L2vh L2vv] ] 

은 내가 원하는 것이 아니다 (6 개) 차원에서 뭔가 끝. 배열 내 배열이 있다면 사실 나는 결과가 어떻게 될지 정확히 유사 할 것으로 예상 단지 행렬 :

[ S11hh S11hv S12hh S12hv ] 
    [ S11vh S11vv S12vh S12vv ] 
S = [ S21hh S21hv S22hh S22hv ] 
    [ S21vh S21vv S22vh S22vv ] 

    [ L1hh L1hv ] 
    [ L1vh L1vv ] 
L = [ L2hh L2hv ] 
    [ L2vh L2vv ] 

은 그 때 나는 다시 그룹을 할 요소 4 우아한 numpyic는 무엇 4.

에 의해 이 배열에서 행렬을 만드는 방법? 나는 bmat를 시도했지만 bmat는 내가 가지고있는 것에 만족하지 않는다; 어떤 이유로 4D 배열이 아닌, 매트릭스 목록으로 잘 작동합니다.

답변

0

전위에 대한 속임수가 있기 때문에 (매트릭스 또는 행렬의 전치 큰 상응하는 행렬의 전치 아닙니다), 원래의 데이터 구조에 따라 BMAT 찡그리고 때문에, 그 코드를 내놓았다 :

def ArrayOfArrayToMatrix(a, transpose=False): 
    """ 
    >>> a1 = np.array([[1, 2], [3, 4]]) 
    >>> a2 = np.array([[5, 6], [7, 8]]) 
    >>> a3 = np.array([[9, 10], [11, 12]]) 
    >>> a4 = np.array([[13, 14], [15, 16]]) 

    With 4D arrays (matrix of matrices): 

    >>> a = np.array([[a1, a2], [a3, a4]]) 
    >>> print ArrayOfArrayToMatrix(a) 
    [[ 1 2 5 6] 
    [ 3 4 7 8] 
    [ 9 10 13 14] 
    [11 12 15 16]] 
    >>> a = np.array([[a1, a2]]) 
    >>> print ArrayOfArrayToMatrix(a) 
    [[ 1 2 5 6] 
    [ 3 4 7 8]] 
    >>> print ArrayOfArrayToMatrix(a, True) 
    [[ 1 2] 
    [ 3 4] 
    [ 5 6] 
    [ 7 8]] 

    With 3D arrays (vector of matrices): 

    >>> a = np.array([a1, a2]) 
    >>> print ArrayOfArrayToMatrix(a) 
    [[ 1 2 5 6] 
    [ 3 4 7 8]] 
    >>> print ArrayOfArrayToMatrix(a, True) 
    [[ 1 2] 
    [ 3 4] 
    [ 5 6] 
    [ 7 8]] 

    """ 
    # bmat doesn't like arrays so we feed it python lists. 
    dim = len(a.shape) 
    if dim == 3: 
     if transpose: 
      lst = [elem.T for elem in a] 
     else: 
      lst = [elem for elem in a] 
    elif dim == 4: 
     if transpose: 
      lst = [[elem.T for elem in row] for row in a] 
     else: 
      lst = [[elem for elem in row] for row in a] 
    else: 
     raise TypeError("Only accepts 3D or 4D arrays.") 
    mat = np.bmat(lst) 
    if transpose: 
     mat = mat.T 
    return mat 

나는 바퀴를 다시 발명합니까?

0

배열 배열 대신 개의 큰 행렬을 만들 수 있습니다 (이 경우 bmat을 사용할 수 있습니다). 이것은 큰 점 제품을 가능하게 할 것입니다. 그런 다음 슬라이스보기로 각 하위 행렬을 참조 할 수 있습니다.

+0

이것이 내가 처음으로 코드를 작성한 방식이었고, 일단 내가 코드를 조각 내고 옮겨야한다는 것을 깨달았을 때 나는 그 코드에서 벗어났습니다. 한 곳에서만 행렬이 필요합니다. 그리고 내가 말했듯이, bmat는이 작업을 위해 상자 밖으로 나오지 않습니다. – Niriel