Numpy 将数组转换为矩阵

Numpy 将数组转换为矩阵,numpy,Numpy,在我的应用程序中,循环使用矩阵的矩阵是很有意义的。因为numpy不喜欢它,而且因为使用数组在大多数情况下都比较轻,所以我最终使用了数组数组。我对他们很满意 看起来是这样的: [ [S11hh S11hv] [S12hh S12hv] ] [ [S11vh S11vv] [S12vh S12vv] ] S = [ ] [ [S21hh S21hv] [S22hh S22hv] ] [ [S21vh S21vv]

在我的应用程序中,循环使用矩阵的矩阵是很有意义的。因为numpy不喜欢它,而且因为使用数组在大多数情况下都比较轻,所以我最终使用了数组数组。我对他们很满意

看起来是这样的:

    [ [S11hh S11hv] [S12hh S12hv] ]
    [ [S11vh S11vv] [S12vh S12vv] ]
S = [                             ]
    [ [S21hh S21hv] [S22hh S22hv] ]
    [ [S21vh S21vv] [S22vh S22vv] ]
这是水平和垂直偏振的反射和透射系数,它是光学的

然而,在我的代码中的某个时刻,我需要使用所有的S进行矩阵乘法,而不是只使用其中的一部分:

M = S.dot(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的数组。这将启用大圆点产品。然后,您可以使用切片视图引用每个子矩阵。

因为有一个关于转置的技巧,矩阵或矩阵的转置不是大型等效矩阵的转置,而且由于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不适合这个任务。