簡體   English   中英

構建一個包含冒號的元組,用於索引一個 numpy 數組

[英]Building a tuple containing colons to be used to index a numpy array

我創建了一個用於處理特定類型的多維數據的類。 此類具有三個屬性: 包含軸名稱的列表 ( self.axisNames ); 包含沿每個軸的參數值的字典( self.axes ;使用軸名稱中的條目鍵入); 和一個包含數據的 numpy 數組,每個軸都有一個維度( self.intensityArr )。

該類還具有根據我對特定情況的需要動態添加新軸的函數,這使得索引強度 Arr 成為一個棘手的命題。 為了更好地建立索引,我開始編寫一個函數來構建我需要的索引:

內課:

def indexIntensityArr(self,indexSpec):
    # indexSpec is a dictionary containing axisName:indexVal entries (indexVal is an int)
    # I want the function to return a tuple for use in indexing (see below def)
    indexList = []
    for axis in self.axisNames:
        if axis in indexSpec:
            indexList.append(indexSpec[axis])
        else:
            # <do something to add : to index list (tuple)>
    return tuple(indexList)

課外:

# ... create an instance of my class called myBlob with 4 dimensions ...

mySpec = {'axis1':10,'axis3':7}
mySlicedArr = myBlob.intensityArr[myBlob.indexIntensityArr(mySpec)]

我希望上面的結果 mySlicedArr 是一個二維數組。

我需要在“else”子句中添加什么才能在用於索引強度Arr的元組中獲得 :(或等效項)? 這可能是解決問題的糟糕方法嗎?

在索引[] ,一個:被轉換為一個slice ,整個內容作為一個元組傳遞給__getitem__

indexList = []
for axis in self.axisNames:
    if axis in indexSpec:
        indexList.append(indexSpec[axis])
    else:
        indexList.append(slice(None))

有幾個numpy函數使用這樣的索引技巧 - 即構建索引值和切片的元組。 或者,如果他們需要改變它,他們將從一個列表開始,該列表可以變異,並在使用前將其轉換為元組。 (例如np.apply_along_axis

是的,切片的完整規范是slice(start, stop, step) ,開始和停止是可選的。 np.arangerange相同。 None等價於:表達式中未指定的值。

np.lib.index_tricks.py一個小自定義類將 : 符號轉換為切片:

In [61]: np.s_[:,:1,0:,::3]
Out[61]: 
(slice(None, None, None),
 slice(None, 1, None),
 slice(0, None, None),
 slice(None, None, 3))

要添加到 hpaulj 的答案中,您可以非常簡單地擴展您的設置,通過使用np.s_使其更加通用。 slice上使用它的優點是您可以更輕松、更透明地使用numpy的切片語法。 例如:

mySpec = {'axis1': np.s_[10:15], 'axis3': np.s_[7:8]}
mySlicedArr = myBlob.intensityArr[myBlob.indexIntensityArr(mySpec)]

(額外信息: np.s_[7:8]僅檢索第 7 列,但它保留了維度,即您的切片數組仍將是 4D,該維度的形狀為 1:對於廣播非常有用)。

如果您還想在函數定義中使用相同的語法:

indexList = []
for axis in self.axisNames:
    if axis in indexSpec:
        indexList.append(indexSpec[axis])
    else:
        indexList.append(np.s_[:])
return tuple(indexList)

所有這些都可以通過slice來完成。 np.s_[10:15]您可以將np.s_[10:15]指定為slice(10, 15) ,將np.s_[:]slice(None)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM