为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕斯709654 2021-08-14 21:17:11
假设我在下面有一个二维数组: [[ 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]


查看完整回答
反对 回复 2021-08-14
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

我尝试另一种方式:

在长度的水平轴上,sizeab,让delta = ((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')


查看完整回答
反对 回复 2021-08-14
  • 3 回答
  • 0 关注
  • 200 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信