Python 如何从特定元素中获取矩阵/网格的对角元素?

Python 如何从特定元素中获取矩阵/网格的对角元素?,python,list,matrix,grid,diagonal,Python,List,Matrix,Grid,Diagonal,我有一个由不同数字组成的8x8网格,我想得到包含给定起始位置的对角线元素。这里有一个例子 l = [[str(randint(1,9)) for i in range(8)] for n in range(8)] >> [ [1 5 2 8 6 9 6 8] [2 2 2 2 8 2 2 1] [9 5 9 6 8 2 7 2] [2 8 8 6 4 1 8 1] [2 5 5 5 4 4 7 9] [3 9 8 8 9 4 1 1] [8 9 2 4 2 8 4 3] [4 4

我有一个由不同数字组成的8x8网格,我想得到包含给定起始位置的对角线元素。这里有一个例子

l = [[str(randint(1,9)) for i in range(8)] for n in range(8)]

>> [
[1 5 2 8 6 9 6 8]
[2 2 2 2 8 2 2 1]
[9 5 9 6 8 2 7 2]
[2 8 8 6 4 1 8 1]
[2 5 5 5 4 4 7 9]
[3 9 8 8 9 4 1 1]
[8 9 2 4 2 8 4 3]
[4 4 7 8 7 5 3 6]
]

我如何从位置x=4和y=3得到对角线(即列表中的第4个元素和第5个元素)?所以我想要的对角线是[5,2,6,4,4,1,3]

这是我想到的。它并不漂亮,但它完成了任务

def get_diagonal(full_grid, y, x):
    if x > y:
        while y >= 1:
            x -= 1
            y -= 1
    else:
        while x >= 1:
            x -= 1
            y -= 1
    diagonal = []
    while x < len(grid) and y < len(grid[0]):
        diagonal.append(grid[x][y])
        x += 1
        y += 1
    return diagonal

grid = [
    [1, 5, 2, 8, 6, 9, 6, 8],
    [2, 2, 2, 2, 8, 2, 2, 1],
    [9, 5, 9, 6, 8, 2, 7, 2],
    [2, 8, 8, 6, 4, 1, 8, 1],
    [2, 5, 5, 5, 4, 4, 7, 9],
    [3, 9, 8, 8, 9, 4, 1, 1],
    [8, 9, 2, 4, 2, 8, 4, 3],
    [4, 4, 7, 8, 7, 5, 3, 6]]

get_diagonal(grid, 5, 3)
def get_对角线(全网格,y,x):
如果x>y:
当y>=1时:
x-=1
y-=1
其他:
当x>=1时:
x-=1
y-=1
对角线=[]
而x
您可以根据
x
y
的差值计算对角线左上角项目的行和列,并根据两个边界的下限和起始行和列的上限之间的差值计算迭代次数:

def diagonal(m, x, y):
    row = max((y - x, 0))
    col = max((x - y, 0))
    for i in range(min((len(m), len(m[0]))) - max((row, col))):
        yield m[row + i][col + i]
以便:

m = [
    [1, 5, 2, 8, 6, 9, 6, 8],
    [2, 2, 2, 2, 8, 2, 2, 1],
    [9, 5, 9, 6, 8, 2, 7, 2],
    [2, 8, 8, 6, 4, 1, 8, 1],
    [2, 5, 5, 5, 4, 4, 7, 9],
    [3, 9, 8, 8, 9, 4, 1, 1],
    [8, 9, 2, 4, 2, 8, 4, 3],
    [4, 4, 7, 8, 7, 5, 3, 6],
]
print(list(diagonal(m, 4, 3)))
产出:

[5, 2, 6, 4, 4, 1, 3]

在我看来,沿行使用“y”和沿垂直方向使用“x”似乎是违反直觉的,所以我将它们互换了。如果您同意从零开始索引,那么这对我很有用:

from random import randint

l = [[str(randint(1,9)) for i in range(8)] for n in range(8)]

# Show the grid
for row in l:
    print(' '.join([str(n) for n in row]))

# Give the initial position, then follow the diagonal down and
# to the right until you run out of rows or columns.
x_pos = 1 
y_pos = 3
diag = []
while x_pos < len(l[0]) and y_pos < len(l):
    diag.append(l[y_pos][x_pos])
    x_pos += 1
    y_pos += 1

print(diag)

从@blhsing answer,我认为迭代次数应该是
min(len(m)-1行,len(m[0])-1列)

让我们看一个例子: 想象一个有两行的矩阵:

[
 [0, 1, 2, 3, 4],
 [0, 1, 2, 3, 4],
]
假设起点是第一行,第四个元素,如果我们使用原始计算(即
min((len(m),len(m[0]))-max((row,col))
),我们将得到(min(2,5)-max(0,3))=2-3=-1


如果我们使用建议的一个(即
min(len(m)-1-row,len(m[0])-1-col)
),我们将得到min(2-1-0,5-1-3)=min(1,1)=1。

我建议查看NumPy库:。在索引方面,请查看他们的文档:。如果你只想坚持列表,请在你的帖子中这样说。你能澄清你的问题吗?看起来你想要得到一个给定x和y的二维“对角线”列表。在您的示例(x=4和y=3)中,x是指行,y是指列吗?如果是的话,(4,3)处的元素不是5吗?那么如何得到[5,2,6,4,4,1,3],它看起来从(0,1)开始,然后转到(1,2),(2,3)等等?请展示您迄今为止的尝试,并解释具体问题。@nofinator是的,x和y代表行和列,抱歉,我不清楚它们代表什么。y=3表示第4个列表,因为第一个列表是第0个列表,x=4表示该列表中的第5个元素。关于你问题的最后一部分,我指的是包含给定元素的对角线。我肯定误解了这个问题-可能是因为我的解决方案与预期的输出不匹配。谢谢@blhsing,这就是我要找的!我还有一个后续问题,我如何改变它来得到另一条对角线,就像在另一个方向的对角线上一样?
[
 [0, 1, 2, 3, 4],
 [0, 1, 2, 3, 4],
]