首页 > 解决方案 > 从子矩阵列表中构建矩阵

问题描述

我正在使用 sympy (python 模块)并且我正在尝试从列表中声明一个矩阵,但我需要一种特定的方式来声明它,因为我知道的那个不适合我的问题。

我有一个这样的数组 listm = [2,0,0,2,0,0,0,0,2,0,0,2,0,0,0,0] ,我想声明一个 Matrix 对象,这样 4 个数字的每个子集(但通常我想为每个 nxn 矩阵实现它)都是一个子矩阵。我的意思是,结果必须是这样的:

[2,0,0,0]
[0,2,0,0]
[2,0,0,0]
[0,2,0,0]

如果我以通常的方式声明,mat = Matrix(4,4,listm)我会得到

[2,0,0,2]
[0,0,0,0]
[2,0,0,2]
[0,0,0,0]

在此先感谢您的帮助

标签: pythonmatrixsympy

解决方案


我对sympy矩阵码不够熟悉。但有了numpy它相对容易。

isympy会话中:

In [2]: listm = [2,0,0,2,0,0,0,0,2,0,0,2,0,0,0,0]
In [3]: import numpy as np
In [4]: arr = np.array(listm)
In [5]: arr
Out[5]: array([2, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0])
In [6]: arr.reshape(4,4)
Out[6]: 
array([[2, 0, 0, 2],
       [0, 0, 0, 0],
       [2, 0, 0, 2],
       [0, 0, 0, 0]])
In [7]: arr.reshape(2,2,2,2)
Out[7]: 
array([[[[2, 0],
         [0, 2]],

        [[0, 0],
         [0, 0]]],


       [[[2, 0],
         [0, 2]],

        [[0, 0],
         [0, 0]]]])
In [8]: arr.reshape(2,2,2,2).transpose(0,2,1,3).reshape(4,4)
Out[8]: 
array([[2, 0, 0, 0],
       [0, 2, 0, 0],
       [2, 0, 0, 0],
       [0, 2, 0, 0]])

sympy.Matrix从中做出:

In [9]: Matrix(_)
Out[9]: 
⎡2  0  0  0⎤
⎢          ⎥
⎢0  2  0  0⎥
⎢          ⎥
⎢2  0  0  0⎥
⎢          ⎥
⎣0  2  0  0⎦

推荐阅读