亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 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=-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')


查看完整回答
反對 回復 2021-08-14
  • 3 回答
  • 0 關注
  • 237 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號