2014-03-27 29 views
1

我有接受一個多維陣列,軸數和我想獲得的索引的函數:Python的使用陣列軸線以選擇切片

def get_slice(my_array, dimension, index): 
    if dimension == 0: 
     slice = my_array[index, :, :] 
    elif dimension == 1: 
     slice = my_array[:, index, :] 
    else: 
     slice = my_array[:, :, index] 
    return np.squeeze(slice) 

但是,我現在有改變代碼接受4個維度,我想知道是否有一個更一般的方法來做到這一點在Python中?

所以,我正在尋找一個函數,該函數接受一個常規的n維數組,維(軸)和索引以在該維/軸上選擇並返回該維上該索引的整個切片。

回答

1

當然,這不是太困難實際上是:

def get_slice(my_array, dimension, index): 
    items = [slice(None, None, None)] * my_array.ndim 
    items[dimension] = index 
    array_slice = my_array[tuple(items)] 
    return np.squeeze(array_slice) 

雖然我不認爲它可以幫助你在這裏,如果你有一個功能,你想沿着第一維度或切片最後一個維度,您可以使用Ellipsis

def get_slice_along_first_dim(array_with_arbitrary_dimensions, idx): 
    return array_with_arbitrary_dimensions[idx, ...] 

def get_slice_along_last_dim(array_with_arbitrary_dimensions, idx): 
    return array_with_arbitrary_dimensions[..., idx] 

你甚至可以做的東西,如:

arr[..., 3, :, 8] 
arr[1, ..., 6] 

如果我記得正確。爲了填充維度,對象只填充所需的儘可能多的空片。

你不能做的是有傳遞到__getitem__超過1個省略號對象:

arr[..., 1, ...] # Fail. 
+0

這是偉大的!感謝你的分享。我同時使用您的答案和get_slice_along_last_dim()函數,這也是我需要的。 –