不了解使用numpy的IndexError

时间:2019-01-19 14:56:31

标签: python numpy matrix symmetric

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

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

有人知道是什么问题吗?

2 个答案:

答案 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