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

Python 如何以特定的方式沿对角线将小矩阵添加到大矩阵中?,python,numpy,matrix,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",n

我试图写一个大矩阵,其中包括一个较小的行矩阵(大小可变),它分布在矩阵的“对角线”上。所有其他值均为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)) 
我想要以下矩阵(很抱歉,我不知道如何显示矩阵,但如果有人也能帮助我,我将非常感激):

它会导致以下错误:


ValueError:操作数无法与形状(0,0)(1,3)(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]])

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

您可以像这样小心地重新塑造形状:

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

您可以像这样小心地重新塑造形状:

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

_“我试图编写一个大矩阵,其中包含一个较小的行矩阵(大小可变),分布在矩阵的“对角线”上。所有其他值都是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]
这个运算是否有一个数学术语需要推广,还是只需要有这个矩阵?在我用单纯形变换到笛卡尔坐标的工作中,你需要做两个矩阵的点积。“我试图写一个大矩阵,其中包括一个较小的行矩阵(大小可变),分布在矩阵的“对角线”上。所有其他值都是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]
这个运算是否有一个数学术语需要推广,还是只需要有这个矩阵?在我用单纯形变换到笛卡尔坐标系的工作中,需要做两个矩阵的点积。第四行是错误的,与OP的预期数组不匹配。在参数中丢失了。UpdatedThat很好,但从第二行开始,行从所需列后的1列开始。第四行错误,与OP的预期数组不匹配。在参数中丢失。UpdatedThat很好,但是从第二行开始,行从所需列后的1列开始。