可以说我下面有一个二维数组:
[[ 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。我相信,如果不采取这一额外步骤,有一种更简单的方法来获得答案,但我想不到。
答案 0 :(得分:0)
您可以考虑使用此方法吗?
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]
答案 1 :(得分:0)
在周期性边界条件下,有一个非常简单的公式可以计算距离。以下我只考虑定期公元前在x轴上:
import numpy as np
# periodic boundary condition for the x-axis only
def steps(start, dest, L_x):
x_start = start[1]
y_start = start[0]
x_dest = dest[1]
y_dest = dest[0]
dx = x_dest - x_start
if np.abs(dx) <= L_x/2:
steps_x = x_dest - x_start
else:
if dx > 0:
steps_x = (x_dest - L_x) - x_start
else:
steps_x = (x_dest + L_x) - x_start
steps_y = y_dest - y_start
return steps_x, steps_y
示例:
grid = np.array([[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 ]])
L_x = grid.shape[1]
start = (4, 1) # (y, x) or (i, j)
dest = (3, 5)
steps_x, steps_y = steps(start, dest, grid)
dir_x = 'left' if steps_x < 0 else 'right'
dir_y = 'up' if steps_y < 0 else 'down'
print(abs(steps_x), dir_x, ',', abs(steps_y), dir_y)
Out: 2 left , 1 up
答案 2 :(得分:0)
我尝试另一种方式:
在长度为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')