作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下用于 numpy 数组的代码:
import numpy as np
a = np.array([[0,1,2,3,4,5,6,7],
[8,9,10,11,12,13,14,15],
[16,17,18,19,20,21,22,23],
[24,25,26,27,28,29,30,31],
[32,33,34,35,36,37,38,39],
[40,41,42,43,44,45,46,47],
[48,49,50,51,52,53,54,55],
[56,57,58,59,60,61,62,63]])
给定一个起点,我需要像骑士在棋盘上那样在棋盘上移动(垂直 2 格,水平 1 格,反之亦然)。
我可以使用 np.argwhere 获取起点的坐标:
np.argwhere(a==13) 返回 [[1 5]]。
我该怎么做才能从那里四处走动?我想测试所有可能的移动,并返回所有坐标。
最佳答案
将有八种可能的组合。我们可以将它们作为 8 x 2
数组中的偏移量,并使用起始 XY 进行广播加法。此外,我们需要调整超出棋盘限制的那些。
因此,给定起始 X,Y 作为元组的实现将是 -
def knight_move(start_xy):
offset1 = np.array([[-2,-1],[-2,1],[2,-1],[2,1]])
idx = np.row_stack((offset1, offset1[:,::-1])) + start_xy
return idx[~((idx < 0) | (idx > 7)).any(1)]
sample 运行-
In [66]: a # Chessboard as array
Out[66]:
array([[ 0, 1, 2, 3, 4, 5, 6, 7],
[ 8, 9, 10, 11, 12, 13, 14, 15],
[16, 17, 18, 19, 20, 21, 22, 23],
[24, 25, 26, 27, 28, 29, 30, 31],
[32, 33, 34, 35, 36, 37, 38, 39],
[40, 41, 42, 43, 44, 45, 46, 47],
[48, 49, 50, 51, 52, 53, 54, 55],
[56, 57, 58, 59, 60, 61, 62, 63]])
In [67]: newXYs = knight_move((1,5)) # 13
In [68]: newXYs
Out[68]:
array([[3, 4],
[3, 6],
[0, 3],
[2, 3],
[0, 7],
[2, 7]])
In [69]: a[newXYs[:,0], newXYs[:,1]]
Out[69]: array([28, 30, 3, 19, 7, 23])
关于Python:作为骑士,我如何在 numpy 数组棋盘上移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40951720/
我是一名优秀的程序员,十分优秀!