Не понимаю эту 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

Кто-нибудь знает, в чем проблема?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
235
2

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

Рад, что был полезен! Не стесняйтесь принять мой ответ, если вы считаете, что это было полезно для вас. :-)

Martijn Pieters 19.01.2019 21:52

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

Другие вопросы по теме