首页 文章

如何将块转换为块对角矩阵(NumPy)

提问于
浏览
12

我在NumPy中有三个相同大小的方形矩阵 . 我想将它们组合成块对角矩阵 .

例:

a1 = np.array([[1,1,1],[1,1,1],[1,1,1]])
a2 = np.array([[2,2,2],[2,2,2],[2,2,2]])
a3 = np.array([[3,3,3],[3,3,3],[3,3,3]])

r = np.array([[1,1,1,0,0,0,0,0,0],[1,1,1,0,0,0,0,0,0],[1,1,1,0,0,0,0,0,0],[0,0,0,2,2,2,0,0,0],[0,0,0,2,2,2,0,0,0],[0,0,0,2,2,2,0,0,0],[0,0,0,0,0,0,3,3,3],[0,0,0,0,0,0,3,3,3],[0,0,0,0,0,0,3,3,3]])

做这个的最好方式是什么?

3 回答

  • 2

    scipy.linalg有一个block_diag函数来自动执行此操作

    >>> a1 = np.array([[1,1,1],[1,1,1],[1,1,1]])
    >>> a2 = np.array([[2,2,2],[2,2,2],[2,2,2]])
    >>> a3 = np.array([[3,3,3],[3,3,3],[3,3,3]])
    >>> import scipy.linalg
    >>> scipy.linalg.block_diag(a1, a2, a3)
    array([[1, 1, 1, 0, 0, 0, 0, 0, 0],
           [1, 1, 1, 0, 0, 0, 0, 0, 0],
           [1, 1, 1, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 2, 2, 2, 0, 0, 0],
           [0, 0, 0, 2, 2, 2, 0, 0, 0],
           [0, 0, 0, 2, 2, 2, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 3, 3, 3],
           [0, 0, 0, 0, 0, 0, 3, 3, 3],
           [0, 0, 0, 0, 0, 0, 3, 3, 3]])
    >>> r = np.array([[1,1,1,0,0,0,0,0,0],[1,1,1,0,0,0,0,0,0],[1,1,1,0,0,0,0,0,0], [0,0,0,2,2,2,0,0,0],[0,0,0,2,2,2,0,0,0],[0,0,0,2,2,2,0,0,0],[0,0,0,0,0,0,3,3,3],[0,0,0,0,0,0,3,3,3],[0,0,0,0,0,0,3,3,3]])
    >>> (scipy.linalg.block_diag(a1, a2, a3)  == r).all()
    True
    
  • 18

    如果你想要这个特定的数组 r ,也许最简单的方法是:

    r=np.kron(np.diag([1,2,3]),np.ones((3,3),dtype='int'))
    

    如果 a1a2a3 可以是任意的二维数组,那么最简单的方法可能是:

    a1=np.asmatrix(a1)
    a2=np.asmatrix(a2)
    a3=np.asmatrix(a3)
    z=np.asmatrix(np.zeros((3,3)))
    r=np.asarray(np.bmat('a1, z, z; z, a2, z; z, z, a3'))
    

    另一种较慢的方法是:

    r=(np.kron([[1,0,0],[0,0,0],[0,0,0]],a1)   
       +np.kron([[0,0,0],[0,1,0],[0,0,0]],a2)
       +np.kron([[0,0,0],[0,0,0],[0,0,1]],a3))
    
  • 1

    由于这些答案, numpy 添加了 block 函数

    In [695]: A=np.arange(1,10).reshape(3,3)
    In [696]: B=np.arange(10,14).reshape(2,2)
    In [698]: C = np.zeros((3,2),int)
    
    In [699]: np.block([[A,C],[C.T,B]])
    Out[699]: 
    array([[ 1,  2,  3,  0,  0],
           [ 4,  5,  6,  0,  0],
           [ 7,  8,  9,  0,  0],
           [ 0,  0,  0, 10, 11],
           [ 0,  0,  0, 12, 13]])
    

相关问题