假设我在下面有一个二维数组: [[ 0 0 0 0 0 0 ] [ 0 0 0 0 0 0 ] [ 0 0 0 0 0 0 ] [ 0 0 0 0 0 2 ] [ 0 1 0 0 0 0 ] [ 0 0 0 0 0 0 ]]我想知道从“1”(索引 4,1)到“2”(索引 3,5)的方向。假设方向只有上、下、左、右。因此没有对角线运动。获取方向的一种方法:"right" if destination.x > start.x else "left" if target.x < start.x else None"down" if destination.y > start.y else "up" if destination.y < start.y else None因此,对于此示例,我们可以通过“向上”或“向右”前往“2”或目的地。那当然只是一步,一旦你移动了,就可以执行同样的逻辑来向目的地靠拢。这种逻辑的问题在于它没有考虑包装。按照这个逻辑,需要 5 个步骤才能到达目的地。由于有包裹,实际上向左或向上走的路更短,只需 3 步即可到达目的地。正在考虑生成另一个数组,其中开始将是数组的中间并执行相同的逻辑。问题是数组是否是偶数(比如这是 6x6,需要填充以获得中间值。例如: [[ 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0] [ 0 2 0 0 0 0 0] [ 0 0 0 1 0 0 0] [ 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0]]这里的数组现在是 7x7。我相信有一种更简单的方法可以在没有这个额外步骤的情况下获得答案,但想不出来。
3 回答
慕沐林林
TA贡献2016条经验 获得超9个赞
你可以考虑使用这种方法吗?
import numpy as np
# build the array
a = np.zeros( (6,6), dtype=int )
a[4][1] = 1
a[3][5] = 2
# extract required informations
i,j = np.where(a == 1)
h,k =np.where(a == 2)
print (i-h) => [1]
print (j-k) => [-4]
繁花不似锦
TA贡献1851条经验 获得超4个赞
我尝试另一种方式:
在长度的水平轴上,size
从a
到b
,让delta = ((b-a)%size*2-1)//size
。
如果
delta=-1
,a=b
:你不动。如果
delta=0
:你必须向右走。如果
delta=1
:你必须向左走。
所以这段代码似乎有效
size=10
vertical=['down','up',None]
horizontal=['right','left',None]
def side(a,b):
return ((b-a)%size*2-1)//size
def step(M1,M2):
x1,y1=M1
x2,y2=M2
return (vertical[side(x1,x2)],horizontal[side(y1,y2)])
例如 :
In [6]: step((2,1),(2,8))
Out[6]: (None, 'left')
添加回答
举报
0/150
提交
取消