如何以特定方式将小矩阵沿着对角线添加到更大的矩阵中?

时间:2019-10-30 14:46:01

标签: python numpy matrix

我正在尝试编写一个大矩阵,其中包括一个较小的行矩阵(大小可变),这些行矩阵分布在矩阵的“对角线”上。所有其他值均为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)一起广播

2 个答案:

答案 0 :(得分:0)

制作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]])

答案 1 :(得分:0)

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

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]])