将阵列数组转换为矩阵
问题描述:
在我的应用程序中,携带矩阵的矩阵很有意义。因为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
)。这将使大点产品。然后你可以用切片视图引用每个子矩阵。
这就是我第一次编写代码的方式,一旦意识到它迫使我切片并转移到所有位置,我就走开了。只有在一个地方,我确实需要一个矩阵。正如我所说的,bmat并不适合这项任务。 – Niriel