2017-10-20 25 views
2

numpy的3D陣列索引假設我有具有形狀(10,1000,1000)一numpy的陣列,並且我有三個列表,這是爲了表示像這樣各軸的索引的範圍:使用列表

z_range = [0, 5] 
y_range = [200, 300] 
x_range = [300, 500] 

我知道我能做到以下幾點,但似乎相當冗長:

arr[z_range[0]:z_range[1], y_range[0]:y_range[1], x_range[0]:x_range[1]] 

有切片使用三個列表這個陣列更簡單的方法?

回答

2

我真的不能相信一個偉大的方式把我的頭頂部。使用Numpy的各種索引技巧可能會有更好的方式。我能想到的最簡單的方法是手動製作slice()對象。 start:end語法實際上直接轉換爲slice(start, end)對象。所以你可以寫:

arr[slice(*z_range), slice(*y_range), slice(*x_range)] 

所以這至少有點更好,但我不認爲你真的在清晰度方面獲得很多。

3

索引需要一個元組,所以你可以構造你的元組動態,用生成器表達式:

>>> z_range = [0, 3] 
>>> y_range = [2, 3] 
>>> x_range = [3, 5] 
>>> arr = numpy.arange(5*5*5).reshape(5,5,5) 
>>> arr[tuple(slice(a, b) for a,b in (x_range, y_range, z_range))] 
array([[[ 85, 86, 87]], 

     [[110, 111, 112]]])