размер ошибки при манипулировании матрицей в python - PullRequest
0 голосов
/ 26 мая 2020

У меня есть матрица с формой (6,5), определенная как:

blockmat= [[1,1,1,1,1],[4,4,4,4,4], [2,2,2,2,2], [5,5,5,5,5], [3,3,3,3,3], [6,6,6,6,6]]

В Matlab эта строка кода:

for i = 1:2
    blockMat(((n*(i-1))+1): (n*i),((n*(i-1))+1): (n*i)) = eye(n)   #n=3 

дала мне в первой итерации a матрица с формой (6,5) и на 2-й итерации матрица (6,6), однако в python, когда я написал:

for i in range(1,3):
    blocMat[3*(i-1): 3*i, 3*(i-1): 3*i]= np.eye(3)

, я получил эту ошибку:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-9-c4459263db11> in <module>
     22 
     23 for i in range(1,3):
---> 24     blocMat[3*(i-1): 3*i, 3*(i-1): 3*i]= np.eye(3)
     25 
     26 

ValueError: could not broadcast input array from shape (3,3) into shape (3,2)

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Если вы просто добавите print(blockmat[3*(i-1): 3*i, 3*(i-1): 3*i]) в свой for l oop, вы увидите, что когда n=1, вы получите матрицу 3X3, которую вы можете обновить до eye.

Но когда n=2, вы получаете 3X2 матрицу - вы не можете выполнить операцию eye с ней.

Вы можете ясно видеть на нескольких отпечатках - шаг за шагом, как blockmat обновляется:

import numpy as np

blockmat= np.array([[1,1,1,1,1],[4,4,4,4,4], [2,2,2,2,2], [5,5,5,5,5], [3,3,3,3,3], [6,6,6,6,6]])

print(blockmat)

for i in range(1,3):
    print(blockmat[3*(i-1): 3*i, 3*(i-1): 3*i])
    blockmat[3*(i-1): 3*i, 3*(i-1): 3*i]  = np.eye(3)
    print(blockmat)

При n=2 выдается ошибка.

0 голосов
/ 26 мая 2020

Поскольку другой ответчик объяснил причину этой ошибки, я дам вам способ ее решения.

передать значения формы в np.eye()

import numpy as np

blockmat= np.array([[1,1,1,1,1],[4,4,4,4,4], [2,2,2,2,2], [5,5,5,5,5], [3,3,3,3,3], [6,6,6,6,6]])

for i in range(1,3):
    x = blockmat[3*(i-1): 3*i, 3*(i-1): 3*i] 
    x = np.eye(x.shape[0],x.shape[1])
    print(x.shape)

Вывод:

(3, 3)
(3, 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...