Не понимаю эту ошибку IndexError, используя numpy - PullRequest
0 голосов
/ 19 января 2019

Мне дана квадратичная матрица, и я должен сделать следующее:

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 голосов
/ 19 января 2019

Вы используете 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
0 голосов
/ 19 января 2019

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()вы.

...