在python中操作矩阵时的错误维度。

问题描述 投票:0回答:1

我有一个shape(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中,这行代码,在第一次迭代时给了我一个形状为(6,5)的矩阵,第二次迭代时给了我一个(6,6)的矩阵。

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

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)
python matlab syntax
1个回答
2
投票

如果你只是添加 print(blockmat[3*(i-1): 3*i, 3*(i-1): 3*i]) 在你 for 循环,你可以看到,当 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
投票

既然其他回答者已经解释了造成这个错误的原因,我就给你一个解决的方法。

将形状值传递给 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)
© www.soinside.com 2019 - 2024. All rights reserved.