Как я могу добавить маленькую матрицу в большую по диагонали определенным образом? - PullRequest
1 голос
/ 30 октября 2019

Я пытаюсь написать большую матрицу, которая включает в себя меньшую матрицу строк (изменяемый размер), которые распределены по «диагонали» матрицы. Все остальные значения равны 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 голосов
/ 30 октября 2019

Вы можете использовать осторожное изменение формы так:

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 голосов
/ 30 октября 2019

Сделать маску на 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]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...