将阵列数组转换为矩阵

问题描述:

在我的应用程序中,携带矩阵的矩阵很有意义。因为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阵列,出于某种原因。

既然有大约换位把戏(矩阵或矩阵的转置是不是大等价矩阵的转置),由于在原始数据结构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 

我是否在重新发明轮子?

您可以创建一个大矩阵而不是阵列阵列(您可以使用bmat)。这将使大点产品。然后你可以用切片视图引用每个子矩阵。

+0

这就是我第一次编写代码的方式,一旦意识到它迫使我切片并转移到所有位置,我就走开了。只有在一个地方,我确实需要一个矩阵。正如我所说的,bmat并不适合这项任务。 – Niriel