我處于需要動態切片可變形狀/維度陣列的情況。所以我組裝了一個字串來訪問它。
這在訪問資料時作業正常。
some_data = eval("arr[:,[ci]]")
#or
some_data = eval("arr[:,[ci],:]")
#or
some_data = eval("arr[:,:,:,[ci]]")
#etc.
但是限制eval()我無法使用這種方法進行分配。
eval("arr[:,[ci]]") = some_data
有沒有辦法可以不用切片eval()?
uj5u.com熱心網友回復:
在Python,對于一個型別索引操作由執行__getitem__/ __setitem__/__delitem__魔術方法。要了解如何解釋索引語法,以及如何呼叫這些方法,我們可以簡單地定義我們自己的類:
class test:
def __getitem__(self, idx):
return idx
test()[:, [1,2,3], ...]
# result: (slice(None, None, None), [1, 2, 3], Ellipsis)
此slice型別是之前在同一檔案中提到的內置型別,帶有指向更具體資訊的鏈接。
Ellipsis只是由文字語法創建的物件的名稱...。這是 Numpy 用來表示任意數量軸的完整范圍的東西 - 所以這讓我們避免擔心我們正在使用的陣列的維度。
要意識到的重要一點是,我們可以直接使用相同的索引元組,以獲得相同的結果。
因此,給定一個要切片的維度[ci],我們可以構造必要的元組,并用它進行索引:
all = slice(None)
def make_index(ci, dimension):
return (all,) * dimension ([ci], Ellipsis)
# Now we can do things like:
arr[make_index(ci, dimension)] = some_data
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/396608.html
