Извлечение диагоналей каждого двухмерного квадратного подмассива из большего двухмерного массива
Это мой первый урок программирования, и я очень рад изучению Python для Data Science. Я не могу понять, как написать цикл, который возвращает все диагональные числа в матрице. Ниже приведен код, насколько я близко или далеко? Спасибо!
import numpy as np
cols = 0
matrixA = np.array([[2,0,0], [0,3,0], [0,0,4], [6,0,0], [0,7,0], [0,0,8]])
for rows in range(6):
if rows == cols:
print(matrixA[rows, cols])
cols = cols + 1
3 ответа
Ваше текущее решение не работает, потому что оно не учитывает тот факт, что matrixA
не квадратный Вы должны позаботиться о том, чтобы ваши показатели не выходили за пределы. Запуск это дает:
IndexError: index 3 is out of bounds for axis 1 with size 3
Это потому, что максимальное значение, которое cols
разрешено брать здесь 2
,
В качестве альтернативы вы можете использовать np.diag
:
print(x)
array([[2, 0, 0],
[0, 3, 0],
[0, 0, 4],
[6, 0, 0],
[0, 7, 0],
[0, 0, 8]])
res = np.array([np.diag(x, -offset) for offset in range(0, *x.shape)])
print(res)
array([[2, 3, 4],
[6, 7, 8]])
Если вы хотите 1D результат, позвоните np.ravel
:
print(res.ravel())
array([2, 3, 4, 6, 7, 8])
Почему Колс вообще? Это всегда так же, как строки, верно?
for rows in range(6):
print(matrixA[rows,rows])
Вам не нужна тяжелая библиотека, как numpy
чтобы достичь этой простой задачи. В простом Python вы можете сделать это с помощью zip
а также itertools.cycle(...)
как:
>>> from itertools import cycle
>>> my_list = [[2,0,0], [0,3,0], [0,0,4], [6,0,0], [0,7,0], [0,0,8]]
>>> for i, j in zip(my_list, cycle(range(3))):
... print(i[j])
...
2
3
4
6
7
8