【问题标题】:Diagonals in a non-square matrix - python非方阵中的对角线 - python
【发布时间】:2014-12-31 19:23:58
【问题描述】:

在上一个问题中,我找到了一种从方形矩阵中获取所有对角线的方法。这是我的代码:

diags=[[s[y-x][x] for x in range(n) if 0<=y-x<n] for y in range(2*n-1)] 

例如,我有这个矩阵:

m=[[V,A,T],[D,I,S],[O,I,M],[F,U,A]]

这是我想要的输出:

[[V],[D,A],[O,I,T],[F,I,S],[U,M],[A]]

我已经知道如何获得正向和反向的对角线。
问题是这段代码只适用于平方矩阵,但现在我需要找到非方阵中的所有对角线。
我认为问题出在这部分代码上:

for y in range(2*n-1)

我的问题是:有没有办法为非方阵定义对角线?如果有,有人会帮助我吗?
我没有发现任何可以帮助我解决其他问题的问题。
P.S:我不允许使用 numpy。
任何形式的帮助、提示、建议都将不胜感激。

【问题讨论】:

  • 请尝试包含示例输入和预期输出。

标签: python matrix


【解决方案1】:

这是对方阵代码的简单概括。而不是2*n-1 = n+n-1,您需要在外部列表中使用m+n-1,而在内部列表中,您需要检查行和列方向的边界,因为它们会有所不同。

mat = [['V', 'A', 'T'], ['D', 'I', 'S'], ['O', 'I', 'M'], ['F', 'U', 'A']]
rows = len(mat)
cols = len(mat[0])
diags = [[mat[sum_-k][k]
          for k in range(sum_ + 1)
          if (sum_ - k) < rows and k < cols]
         for sum_ in range(rows + cols - 1)]
print(diags)

结果:

[
    ['V'],
    ['D', 'A'],
    ['O', 'I', 'T'],
    ['F', 'I', 'S'],
    ['U', 'M'],
    ['A']
]

【讨论】:

  • 非常感谢!这正是我所需要的。
【解决方案2】:

以下代码(在 c++ 中)将打印对角线:

#include <iostream>

int main() {
    char matrix[4][3] = { {'V',  'A',  'T'},
                          {'D',  'I',  'S'},
                          {'O',  'I',  'M'},
                          {'F',  'U',  'A'}};

    int m = 4, n = 3;

    for (int i = 0; i < m + n - 1; i++) {      //m+n-1 = 4+3-1 = 6 diagonals   
        int z1 = i < n ? 0 : i - n + 1;
        int z2 = i < m ? 0 : i - m + 1;

        for (int j = i - z2; j >= z1; j--)
                std::cout << matrix[j][i - j] << " ";

        std::cout << endl;
    }

    return 0;
}

输出:

V 
D A 
O I T 
F I S 
U M 
A

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多