2012-08-24 39 views
22

我想切割一個numpy數組來獲得最後維度中的第i個索引。對於3D陣列,這將是:任意尺寸的Numpy切片

slice = myarray[:,:,i] 

但我寫一個函數,我可以採取任意尺寸的陣列,所以對於一個四維陣列我需要myarray[:,:,:,i],等等。有沒有一種方法可以獲得這個切片的任何數組,而不必明確寫入數組維度?

回答

35

...Ellipsis,這正是這一點:

slice = myarray[...,i] 

省略號是Python對象,如果你要想要使用它的方括號外面。

+0

謝謝,我不知道這件事。我自己的答案允許更通用的切片,但你真的很酷。 – tiago

+0

@tiago事實上,你總是可以建立一個切片元組。 >你也可以在那裏使用省略號... – seberg

5

其實剛纔找到了答案。如numpy's documentation中所述,這可以通過切片對象完成。在我的具體情況,這將做到這一點:

idx = [slice(None)] * (myarray.ndim - 1) + [i] 
my_slice = myarray[idx] 

slice(None)等同於選擇在該指數的所有元素,最後[I]爲最後一維的特定索引。

+0

我正要提出這個建議,但實際上塞巴斯蒂安的方法更加優雅!另外,我不認爲你的代碼真正起作用,你將一個列表與一個元組相乘,然後你連接一個沒有'slice()'對象的裸指數。也許你的意思是'[slice(None)] * myarray.shape [-1] + [slice(None,i)]' –

+1

@NiklasB。最後一個'[i]'是正確的,但是如果不使用省略號,第一部分必須是'(myarray.ndim - 1)'。 – seberg

+0

@塞巴斯蒂安,你是對的,我用一個數字測試,然後忘了把len(myarray.shape [: - 1])。我只是用你的建議來解決它。 – tiago

2

在切任意尺寸方面,以前優秀的答案可以擴展到:

indx = [Ellipsis]*myarray.ndim 
indx[slice_dim] = i 
slice = myarray[indx] 

這從任何層面slice_dim返回片 - slice_dim = -1再現以前的答案。但我發現以前的版本更易讀

indx = [Ellipsis]*(slice_dim) + [i] + [Ellipsis]*(myarray.ndim-slice_dim-1) 

: - 爲了完整上述上市首兩行可以濃縮到。