2011-12-02 226 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是這樣的:

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

如果我天真地運行

M = S.dot(L) 

我結束了在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由4

什麼是優雅numpyic從這些數組中製作矩陣的方法?我嘗試過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