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

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

Numpy where() 使用隨數組中項目位置而變化的條件

Numpy where() 使用隨數組中項目位置而變化的條件

海綿寶寶撒 2023-06-27 14:20:54
我正在嘗試使用 numpy 構建一個網格世界。網格為4*4,排列成正方形。第一個和最后一個方格(即 1 和 16)是終端方格。在每個時間步,您可以向任意方向移動一步:上、下、左或右。一旦您進入終端方塊之一,就不可能再進行進一步的移動,游戲就會終止。第一列和最后一列是正方形的左邊緣和右邊緣,而第一行和最后一行代表頂部邊緣和底部邊緣。如果您位于邊緣(例如左邊的邊緣)并嘗試向左移動,您不會向左移動,而是停留在開始所在的方格中。類似地,如果您嘗試穿過任何其他邊,您也會停留在同一個方格中。雖然網格是一個正方形,但我將它實現為一個數組。states_r 計算右移后狀態的位置。1 和 16 保持原樣,因為它們是終止狀態(請注意,代碼使用基于零的計數,因此 1 和 16 在代碼中分別是 0 和 15)。其余的方格都加一。states_r 的代碼可以工作,但是右邊緣上的那些方塊,即 (4, 8, 12) 也應該保持在原來的位置,但 states_r 代碼不會這樣做。State_l 是我嘗試包含正方形左邊緣的邊緣條件。邏輯是相同的,終端狀態 (1, 16) 不應移動,左側邊緣的那些方塊 (5, 9, 13) 也不應移動。我認為一般邏輯是正確的,但它產生了錯誤。states = np.arange(16) states_r = states[np.where((states + 1 <= 15) & (states != 0), states + 1, states)] states_l = states[np.where((max(1, (states // 4) * 4) <= states - 1) & (states != 15), states - 1, states)]第一個示例 states_r 有效,它處理終端狀態,但不處理邊緣條件。第二個例子是我嘗試包含邊緣條件,但是它給了我以下錯誤:“具有多個元素的數組的真值是不明確的?!庇腥丝梢越忉屢幌氯绾涡迯臀业拇a嗎?或者建議另一種解決方案,理想情況下我希望代碼速度快(這樣我就可以擴展它),所以我想盡可能避免 for 循環?
查看完整描述

2 回答

?
烙印99

TA貢獻1829條經驗 獲得超13個贊

如果我理解正確的話,你需要數組來指示每個狀態的下一個狀態,具體取決于移動(右、左、上、下)。如果是這樣,我猜你的退出執行state_r不正確。我建議切換到網格的 2D 表示,因為如果直接有 x 和 y (至少對我來說),您描述的很多事情會更容易、更直觀地處理。


import numpy as np


n = 4

states = np.arange(n*n).reshape(n, n)

states_r, states_l, states_u, states_d = (states.copy(), states.copy(), 

                                          states.copy(), states.copy())

states_r[:, :n-1] = states[:, 1:]

states_l[:, 1:] = states[:, :n-1]

states_u[1:, :] = states[:n-1, :]

states_d[:n-1, :] = states[1:, :]


#        up             [[ 0,  1,  2,  3],

#  left state right      [ 0,  1,  2,  3],

#       down             [ 4,  5,  6,  7],

#                        [ 8,  9, 10, 11]]

#

#  [[ 0,  0,  1,  2],   [[ 0,  1,  2,  3],   [[ 1,  2,  3,  3],

#   [ 4,  4,  5,  6],    [ 4,  5,  6,  7],    [ 5,  6,  7,  7],

#   [ 8,  8,  9, 10],    [ 8,  9, 10, 11],    [ 9, 10, 11, 11],

#   [12, 12, 13, 14]]    [12, 13, 14, 15]]    [13, 14, 15, 15]]

#

#                       [[ 4,  5,  6,  7],

#                        [ 8,  9, 10, 11],

#                        [12, 13, 14, 15],

#                        [12, 13, 14, 15]]


如果你想排除終端狀態,你可以這樣做:


terminal_states = np.zeros((n, n), dtype=bool)

terminal_states[0, 0] = True

terminal_states[-1, -1] = True

states_r[terminal_states] = states[terminal_states]

states_l[terminal_states] = states[terminal_states]

states_u[terminal_states] = states[terminal_states]

states_d[terminal_states] = states[terminal_states]

如果您更喜歡一維方法:


import numpy as np


n = 4

states = np.arange(n*n)

valid_s = np.ones(n*n, dtype=bool)

valid_s[0] = False

valid_s[-1] = False


states_r = np.where(np.logical_and(valid_s, states % n < n-1), states+1, states)

states_l = np.where(np.logical_and(valid_s, states % n > 0),   states-1, states)

states_u = np.where(np.logical_and(valid_s, states > n-1),     states-n, states)

states_d = np.where(np.logical_and(valid_s, states < n**2-n),  states+n, states)


查看完整回答
反對 回復 2023-06-27
?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

另一種無需預分配數組的方法:


states = np.arange(16).reshape(4,4)


states_l = np.hstack((states[:,0][:,None],states[:,:-1],))

states_r = np.hstack((states[:,1:],states[:,-1][:,None]))

states_d = np.vstack((states[1:,:],states[-1,:]))

states_u = np.vstack((states[0,:],states[:-1,:]))

為了將它們全部變為一維,您始終可以使用flatten()/ravel()/reshape(-1)二維數組。


                  [[ 0  1  2  3]

                   [ 0  1  2  3]

                   [ 4  5  6  7]

                   [ 8  9 10 11]]


[[ 0  0  1  2]    [[ 0  1  2  3]    [[ 1  2  3  3]

 [ 4  4  5  6]     [ 4  5  6  7]     [ 5  6  7  7]

 [ 8  8  9 10]     [ 8  9 10 11]     [ 9 10 11 11]

 [12 12 13 14]]    [12 13 14 15]]    [13 14 15 15]]

                  

                  [[ 4  5  6  7]

                   [ 8  9 10 11]

                   [12 13 14 15]

                   [12 13 14 15]]

對于角落,你可以這樣做:


states_u[-1,-1] = 15

states_l[-1,-1] = 15


查看完整回答
反對 回復 2023-06-27
  • 2 回答
  • 0 關注
  • 177 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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