如何从对应点找到列表中的对角线

问题描述 投票:0回答:1

所以,我想从列表中的元素(点)找到列表中的对角线。

我的列表 dims 是 8x8

例如:

在以下列表中

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

[6,7,8,9,10],

[11,12,13,14,15],

]

我的对角线参考点是 9

所以输出应该是

diagonal1 = [2,9,15](从左点到右角对角线)

对角线 2 = [5,9,13]

我尝试使用 numpy.diagonal 进行相同但偏移部分似乎不起作用。

board_state = [
    'r', 'n', 'b', 'q', 'k', 'b', 'n', 'r',
    'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p',
    '', '', '', '', '', '', '', '',
    '', 'b2', '', '', '', '', '', '',
    '', '', '', '', '', '', '', '',
    '', '', '', '', '', '', '', '',
    'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P',
    'R', 'N', 'B', 'K', 'Q', 'B', 'N', 'R'
]
def diagonals(board_state):
    board_state = np.array(board_state)
    diagonals_lst = np.diagonal(board_state.reshape([8, 8]), offset=-1)
#point of reference for now is b2
python numpy arraylist chess
1个回答
0
投票

你在正确的轨道上——

np.diagonals
非常适合这个,但你需要小心计算偏移量。

在 numpy 中(按照惯例在矩阵数学中)对角线从左上角到右下角。主对角线的偏移量为 0;上面的对角线有正偏移,下面的对角线有负偏移。

这与标准的国际象棋符号很相配:棋盘左上角的方块 (a8) 应该有偏移量

0
,如果我们向左偏移量应该增加 1,如果我们向下偏移量应该减少 1。如果我们计算
a => 0, b => 1, c => 2, ...
的 x 偏移量,那么我们可以添加 y 偏移量,以补偿我们希望位置 8 具有偏移量 0 的事实:

    xoffset = ord(pos[0]) - ord('a')
    yoffset = int(pos[1]) - 8
    diagonal_offset = xoffset + yoffset

然后考虑反对角线,从右上角到左下角。没有特定的 numpy 函数来访问这些——numpy.diagonal 的文档指出我们可以从左到右翻转数组并取结果的对角线。由于我们是从左向右翻转,结果数组中的 y 偏移量将是相同的,但 x 偏移量也需要翻转(即

7 - xoffset
):

    antidiagonal_offset = (7 - xoffset) + yoffset

放在一起我们有:

import numpy as np

board_state = np.array([
    'r', 'n', 'b', 'q', 'k', 'b', 'n', 'r',
    'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p',
    '', '', '', '', '', '', '', '',
    '', 'b2', '', '', '', '', '', '',
    '', '', '', '', '', '', '', '',
    '', '', '', '', '', '', '', '',
    'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P',
    'R', 'N', 'B', 'K', 'Q', 'B', 'N', 'R'
]).reshape((8, 8))

def compute_offsets(pos):
    xoffset = ord(pos[0]) - ord('a')
    yoffset = int(pos[1]) - 8
    return (xoffset + yoffset, (7 - xoffset) + yoffset)

while True:
    val = input()
    diag_offset, antidiag_offset = compute_offsets(val)

    diagonals_lst = np.diagonal(board_state.reshape([8, 8]), offset=diag_offset)
    print("top-left to bottom-right", diagonals_lst)

    antidiagonals_lst = np.diagonal(np.fliplr(board_state), offset=antidiag_offset)
    print("top-right to bottom-left", antidiagonals_lst)

示例输出:

b2
  top-left to bottom-right ['' 'P' 'B']
  top-right to bottom-left ['r' 'p' '' '' '' '' 'P' 'R']
b1
  top-left to bottom-right ['P' 'N']
  top-right to bottom-left ['p' '' '' '' '' 'P' 'N']
a8
  top-left to bottom-right ['r' 'p' '' '' '' '' 'P' 'R']
  top-right to bottom-left ['r']
g6
  top-left to bottom-right ['k' 'p' '' '']
  top-right to bottom-left ['p' '' '' '' '' 'P' 'N']
© www.soinside.com 2019 - 2024. All rights reserved.