我有一个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)
如果你只是添加 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
你得到的错误。
既然其他回答者已经解释了造成这个错误的原因,我就给你一个解决的方法。
将形状值传递给 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)