使用 wrap 在 numpy 中建立索引的最佳方式

假设我在下面有一个二维数组:


 [[ 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。我相信有一种更简单的方法可以在没有这个额外步骤的情况下获得答案,但想不出来。


慕斯709654
浏览 201回答 3
3回答

慕沐林林

你可以考虑使用这种方法吗?import numpy as np# build the arraya = np.zeros( (6,6), dtype=int )a[4][1] = 1a[3][5] = 2# extract required informationsi,j = np.where(a == 1)h,k =np.where(a == 2)print (i-h) => [1]print (j-k) => [-4]

繁花不似锦

我尝试另一种方式:在长度的水平轴上,size从a到b,让delta = ((b-a)%size*2-1)//size。如果delta=-1,a=b:你不动。如果delta=0:你必须向右走。如果delta=1:你必须向左走。所以这段代码似乎有效size=10vertical=['down','up',None]horizontal=['right','left',None]def side(a,b):&nbsp; &nbsp; return ((b-a)%size*2-1)//sizedef step(M1,M2):&nbsp; &nbsp; x1,y1=M1&nbsp; &nbsp; x2,y2=M2&nbsp; &nbsp; return (vertical[side(x1,x2)],horizontal[side(y1,y2)])例如 :In [6]: step((2,1),(2,8))Out[6]: (None, 'left')
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python