首页 > 解决方案 > 不理解这个 IndexError 使用 numpy

问题描述

我得到一个二次矩阵,必须执行以下操作:

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

有人知道问题是什么吗?

标签: pythonnumpymatrixsymmetric

解决方案


np.size(),没有轴,为您提供矩阵中元素的总数。所以你range()的 s 将从 0 到 8,而不是从 0 到 2。

你不需要使用np.size()or 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()对你有用。


推荐阅读