Мне дана квадратичная матрица, и я должен сделать следующее:
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
Кто-нибудь знает, в чем проблема?






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().
Вы неправильно используете 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
Рад, что был полезен! Не стесняйтесь принять мой ответ, если вы считаете, что это было полезно для вас. :-)