【问题标题】:Python 3: Get diagonal elements of matrix (list of lists) about a point in that matrix without NumPyPython 3:在没有 NumPy 的情况下获取关于该矩阵中某个点的矩阵(列表列表)的对角元素
【发布时间】:2020-03-03 11:48:54
【问题描述】:

我有一个矩阵(由列表组成),看起来像:

matrix = [[0, 0, 0, 0, 5],
          [0, 0, 0, 4, 0],
          [2, 0, 3, 0, 0],
          [3, 2, 0, 2, 0],
          [1, 0, 2, 0, 1]]

我正在努力创建一个函数,它将这个矩阵作为输入,以及矩阵中的一个位置 - 由一个元组表示 - 并返回与该点相交的两条对角线(不使用 NumPy )。例如,

def getDiagonal(matrix, pos)
    (row, col) = pos
    # Smart diagonal finder code #
    return (diag1, diag2)

diagonals = getDiagonals(matrix, (1, 1))
print(diagnonal[0])
print(diagnonal[1])

print(' ')

diagonals = getDiagonals(matrix, (1, 3))
print(diagnonal[0])
print(diagnonal[1])

预期输出:

OUT: [5, 4, 3, 2, 1]
OUT: [2, 2, 2]
OUT: 
OUT: [0, 2, 2]
OUT: [0, 0, 3, 2, 1]

值得指出的是,我不介意从哪个方向(从下到上或从上到下)返回对角线的元素。它们可以很容易地以一种方式完成,如果需要,可以使用 reverse() 来尊重它们。

我看过类似的问题,例如this one,但这主要涉及获取矩阵的前导对角线,并且提供的关于获取点的对角线的信息较少。

非常感谢您提前提供的帮助和 cmets!

【问题讨论】:

  • 你是从左下角取行和列的位置吗?并期望返回的向量自下而上排序?这对于 Python 来说是非常规的,但如果这是一个要求,请在问题中说明这一点。此外,查看您是否尝试过任何代码可能会有所帮助。
  • @jdehesa 谢谢!我盯着那个矩阵看了大约 5 分钟,试图弄清楚他在哪里得到了他的预期输出......
  • 抱歉,返回的对角线的方向对我来说并不重要。至于我目前的代码,没有什么比那里更多的了:'(
  • 编辑了输出以获得更好的清晰度。谢谢指出!
  • 使用for-loop 从位置(a+(-2), b+(-2)) (a+(-1),b+(-1)), (a+0, b+0), (a+1, b+1) 和第二个(a+(-2), b+2) (a+(-1),b+1), (a+0, b+0), (a+1, b+(-1)) 获得一个对角线。但是您将需要更大的范围 - 即(-width, width) 或更精确地计算

标签: python list matrix python-3.6 diagonal


【解决方案1】:

有点混乱,但我认为这样做:

def getDiagonals(matrix, pos):
    row, col = pos
    nrows = len(matrix)
    ncols = len(matrix[0]) if nrows > 0 else 0
    # First diagonal
    d1_i, d1_j = nrows - 1 - max(row - col, 0), max(col - row, 0)
    d1_len = min(d1_i + 1, ncols - d1_j)
    diag1 = [matrix[d1_i - k][d1_j + k] for k in range(d1_len)]
    # Second diagonal
    t = min(row, ncols - col - 1)
    d2_i, d2_j = nrows - 1 - row + t, col + t
    d2_len = min(d2_i, d2_j) + 1
    diag2 = [matrix[d2_i - k][d2_j - k] for k in range(d2_len)]
    return (diag1, diag2)

# Test
matrix = [[0, 0, 0, 0, 5],
          [0, 0, 0, 4, 0],
          [2, 0, 3, 0, 0],
          [3, 2, 0, 2, 0],
          [1, 0, 2, 0, 1]]
diagonals = getDiagonals(matrix, (1, 1))
print(diagonals[0])
# [1, 2, 3, 4, 5]
print(diagonals[1])
# [2, 2, 2]

diagonals = getDiagonals(matrix, (1, 3))
print(diagonals[0])
# [2, 2, 0]
print(diagonals[1])
# [1, 2, 3, 0, 0]

diagonals = getDiagonals(matrix, (2, 2))
print(diagonals[0])
# [1, 2, 3, 4, 5]
print(diagonals[1])
# [1, 2, 3, 0, 0]

【讨论】:

  • 查找diag1 可以使用此方法,但是在为我正在测试的5x5 矩阵查找diag2 时会出现IndexError。但我无法发现错误?
  • @GBean 抱歉,一个表达式中有一个错误的符号,现在已修复。
猜你喜欢
  • 2011-09-12
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 2021-08-17
  • 2014-02-08
相关资源
最近更新 更多