使用自动换行进入numpy中的索引的最佳方法

时间:2018-11-11 18:31:15

标签: python arrays numpy matrix

可以说我下面有一个二维数组:

 [[ 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 个答案:

答案 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的水平轴上,要使abdelta = ((b-a)%size*2-1)//size

  • 如果delta=-1a=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')