【问题标题】:How can I add a small matrix into a bigger one along the diagonal in a specific way?如何以特定方式将小矩阵沿对角线添加到更大的矩阵中?
【发布时间】:2019-10-31 00:57:57
【问题描述】:

我正在尝试编写一个大矩阵,其中包含一个较小的行矩阵(大小可变),这些矩阵分布在矩阵的“对角线”上。所有其他值都是 0。如何创建这样的矩阵?

我试过 np.put、np.append。到目前为止,这是我所拥有的:

t = [1,2,3] 

n=3

m=4

A = np.zeros((2*m,m*n+m),dtype=int)

for i in range (m):
    A[i-1:i-1+t.shape[0], n*(i-1):n*(i-1)+t.shape[1]] += t
print("A= \n",np.matrix(A)) 

我想要以下矩阵(对不起,我不知道如何显示矩阵,但如果有人也可以帮助我,我将不胜感激):

A= 

 [[1 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0]

 [0 0 0 1 2 3 0 0 0 0 0 0 0 0 0 0 ]

 [0 0 0 0 0 0 1 2 3 0 0 0 0 0 0 0]

 [0 0 0 0 0 0 0 0 0 1 2 3 0 0 0 0]

 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]

它会导致以下错误:

ValueError: 操作数不能与形状 (0,0) (1,3) (0,0) 一起广播

【问题讨论】:

  • _ "我正在尝试编写一个大矩阵,其中包括一个较小的行矩阵(大小可变),该矩阵分布在矩阵的“对角线”上。所有其他值都是 0。如何创建这样的矩阵?”我无法理解这意味着什么。您只是想创建特定的矩阵吗?
  • 为什么第五个列表不是[0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 0]
  • 我想创建这个特定的矩阵。这不是你给我的,因为我为单纯形分辨率创建了这个,我必须将该部分保留为空。
  • 这不一定能回答我关于为什么第五个列表向下的问题,即当前[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 与模板[0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 0] 不匹配
  • 这个运算有没有数学术语需要泛化,还是只需要这个矩阵?在我将单纯形转换为笛卡尔坐标的工作中,您需要对两个矩阵进行点积。

标签: python numpy matrix


【解决方案1】:

你可以像这样小心地重塑:

t = [1,2,3]     
n=3
m=4
A = np.zeros((2*m,m*n+m),dtype=int)

A.ravel()[:m*(m*n+m+n)].reshape(m,-1)[:,:len(t)] = t
A
# array([[1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
#        [0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

【讨论】:

    【解决方案2】:

    为12个位置制作掩码并将其用于分配

    idx = np.zeros(A.shape).astype(bool)
    for i in range(m):
        idx[i,i*n:i*n+3] = True
    A[idx]= t*m
    
    array([[1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
    

    【讨论】:

    • 第四行错误,与OP的预期数组不匹配。
    • 迷失在参数中。更新
    • 这很好,但是从第二行开始,该行在想要的列之后的 1 列开始。
    猜你喜欢
    • 1970-01-01
    • 2021-12-12
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多