所以,我想从列表中的元素(点)找到列表中的对角线。
我的列表 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
你在正确的轨道上——
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']