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