我得到一个二次矩阵,必须执行以下操作:
For each entry (i,j) in the matrix
If i = j:
set y[i,j] = x[i,j].
Else:
set y[i,j] = x[i,j] + x[j,i]
我编写了以下脚本:
def symmetrize(x):
## The symmetrized matrix that is returned
y = np.zeros(np.shape(x))
## For loop for each element (i,j) in the matrix
for i in range (np.size(x)):
for j in range (np.size(x)):
if i == j:
y[i,j] = x[i,j]
else:
y[i,j] = x[i,j] + x[j,i]
return y
每当我要使用以下矩阵运行代码时,都会收到此错误消息:
np.array([[1.2, 2.3, 3.4],[4.5, 5.6, 6.7], [7.8, 8.9, 10.0]])
错误消息:
y[i,j] = x[i,j] + x[j,i]
IndexError: index 3 is out of bounds for axis 1 with size 3
有人知道是什么问题吗?
答案 0 :(得分:2)
np.size()
(无轴)为您提供矩阵中的元素总数。因此,您的range()
将从0-8开始,而不是从0-2开始。
您不必为此使用np.size()
或np.shape()
;这些功能甚至都没有在文档中列出。只需使用矩阵的.shape
属性:
y = np.zeros(x.shape)
for i in range(x.shape[0]):
for j in range(x.shape[1]):
有更好的方法来产生输出。您可以使用:
def symmetrize(x):
return x + x.T - np.diag(x.diagonal())
相反。 x.T
是转置矩阵,因此行和列被交换。 x + x.T
是原始矩阵和转置矩阵的和,因此对角线上的数字加倍。 x.diagonal()
是仅包含对角线上那些数字的数组,一旦您在对角线上创建了这些数字矩阵即可将其减去,这就是np.diag()
为您完成的工作。
答案 1 :(得分:0)
您使用np.size()
的方式是错误的,它不会告诉您列表有多少行或列,但可以告诉您数组中元素的数量-9
。您可以像这样使用列表的形状:
def symmetrize(x):
## The symmetrized matrix that is returned
y = np.zeros(np.shape(x))
## For loop for each element (i,j) in the matrix
for i in range(x.shape[0]):
for j in range(x.shape[1]):
if i == j:
y[i,j] = x[i,j]
else:
y[i,j] = x[i,j] + x[j,i]
return y