从更大的二维数组中提取每个二维方形子数组的对角线

Extract diagonals of each 2D square sub-array from a larger 2D array

这是我的第一个编程 class,我很高兴学习 Python 数据科学。我不知道如何编写一个 returns 矩阵中所有对角线数字的循环。下面是代码,我有多近或多远?谢谢!

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

你不需要像 numpy to achieve this simple task. In plain python you can do it via using zip and 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

为什么要有 cols?它总是与行相同,对吗?

for rows in range(6):
    print(matrixA[rows,rows])

您当前的解决方案不起作用,因为它没有考虑到 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]])

如果您想要一维结果,请调用 np.ravel:

print(res.ravel())
array([2, 3, 4, 6, 7, 8])