【问题标题】:Extract diagonals of each 2D square sub-array from a larger 2D array从更大的二维数组中提取每个二维正方形子数组的对角线
【发布时间】:2017-09-21 21:55:25
【问题描述】:

这是我的第一堂编程课,我很高兴学习 Python for 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

【问题讨论】:

  • 首先,问自己“元素 2、3、4、6、7、8 出现在哪里?”,这将有助于您深入了解如何获取元素

标签: python arrays loops numpy diagonal


【解决方案1】:

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

【讨论】:

  • @roganjosh 这工作谢谢!你能分解res代码部分吗?很抱歉有这么多问题,我是 Python 新手,非常感谢我在这里得到的大量反馈!谢谢!
  • @Brandon 我已将您链接到文档。 np.diag 中有一个 offset 参数,允许您指定从何处开始提取对角线元素的行号。我们希望以 3 的步长(在本例中)向下移动行,这就是 range 所做的。
  • range(0, *x.shape) 是给初学者的相当不透明的代码,@cᴏʟᴅsᴘᴇᴇᴅ。他所做的是将shape(在这种情况下为(6, 3))附加到range 的参数中,这样range(0, *x.shape) 就变成了range(0, 6, 3) - > [0, 3]* 解包元组,所以如果没有它,结果将是 range(0, (6, 3)) 不起作用。
【解决方案2】:

您不需要像numpy 这样的繁重库来完成这个简单的任务。在普通 python 中,您可以通过使用 zipitertools.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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 如果matrixA 是正方形,但事实并非如此。
    猜你喜欢
    • 2020-03-29
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    相关资源
    最近更新 更多