python - 创建矩阵(数组),其中每个元素本身就是一个矩阵

标签 python python-3.x numpy

我有四个 mxn 矩阵。我想从这些矩阵创建一个 mxn 矩阵矩阵,这样新矩阵的每个元素都是一个 2x2 矩阵,从每个矩阵中获取相应的元素。到目前为止,我可以考虑堆叠所有四个矩阵,然后沿 z 轴 reshape 每个元素并替换它。我相信对此有更优雅的解决方案。 输入示例:

$$
\begin{bmatrix}
A_{11} & A_{12}\\ 
A_{21} & A_{22}
\end{bmatrix}
,

\begin{bmatrix}
B_{11} & B_{12}\\ 
B_{21} & B_{22}
\end{bmatrix}
,

\begin{bmatrix}
C_{11} & C_{12}\\ 
C_{21} & C_{22}
\end{bmatrix}
,

\begin{bmatrix}
D_{11} & D_{12}\\ 
D_{21} & D_{22}
\end{bmatrix}
$$

预期输出:

$$
\begin{bmatrix}
\begin{bmatrix}
A_{11} & B_{11}\\ 
C_{11} & D_{11}
\end{bmatrix} & \begin{bmatrix}
A_{12} & B_{12}\\ 
C_{12} & D_{12}
\end{bmatrix}\\ 
\begin{bmatrix}
A_{21} & B_{21}\\ 
C_{21} & D_{21}
\end{bmatrix} & \begin{bmatrix}
A_{22} & B_{12}\\ 
C_{22} & D_{22}
\end{bmatrix}
\end{bmatrix
$$

最佳答案

创建函数示例:

In [510]: def foo(astr,m,n):
     ...:     alist = [astr+'%d%d'%(i,j) for i in range(m) for j in range(n)]
     ...:     return np.array(alist).reshape(m,n)
In [511]: foo('A',2,2)
Out[511]: 
array([['A00', 'A01'],
       ['A10', 'A11']], dtype='<U3')

4 个此类数组的列表:

In [512]: alist = [foo('A',2,2),foo('B',2,2),foo('C',2,2),foo('D',2,2)]

多种堆叠方式:

In [513]: np.stack(alist)
Out[513]: 
array([[['A00', 'A01'],
        ['A10', 'A11']],

       [['B00', 'B01'],
        ['B10', 'B11']],

       [['C00', 'C01'],
        ['C10', 'C11']],

       [['D00', 'D01'],
        ['D10', 'D11']]], dtype='<U3')

In [514]: np.stack(alist,2)
Out[514]: 
array([[['A00', 'B00', 'C00', 'D00'],
        ['A01', 'B01', 'C01', 'D01']],

       [['A10', 'B10', 'C10', 'D10'],
        ['A11', 'B11', 'C11', 'D11']]], dtype='<U3')
In [515]: _.shape
Out[515]: (2, 2, 4)

可以通过多种方式 reshape 它:

In [516]: __.reshape(2,2,2,2)
Out[516]: 
array([[[['A00', 'B00'],
         ['C00', 'D00']],

        [['A01', 'B01'],
         ['C01', 'D01']]],


       [[['A10', 'B10'],
         ['C10', 'D10']],

        [['A11', 'B11'],
         ['C11', 'D11']]]], dtype='<U3')
In [517]: _.reshape(4,2,2)
Out[517]: 
array([[['A00', 'B00'],
        ['C00', 'D00']],

       [['A01', 'B01'],
        ['C01', 'D01']],

       [['A10', 'B10'],
        ['C10', 'D10']],

       [['A11', 'B11'],
        ['C11', 'D11']]], dtype='<U3')

您可以创建一个轴,然后将轴调换到您喜欢的内容,而不是使用不同的轴。

关于python - 创建矩阵(数组),其中每个元素本身就是一个矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51774605/

相关文章:

python - Matplotlib 忽略采样数据帧的宽度

jquery - 如何在 Flask 中使用 Ajax

python - 在 python 中复制 R/ggplot2 颜色

python-3.x - QStackedWidget - 一页一页地改变页面

python - 元组作为多维数组的索引

python - 更新字典而不添加新键?

python-3.x - Pandas 多索引根据其他列中的值从值中减去

python - 如何从 Python3 中给定的值列表中获取字符串中每个字符的值?

python - 在 Fipy 中求解多个偏微分方程

python - 如何使特征值和特征向量保持真实而不是复杂?