Извлечение диагоналей каждого двухмерного квадратного подмассива из большего двухмерного массива

Это мой первый урок программирования, и я очень рад изучению 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
Другие вопросы по тегам