2014-12-19 30 views
3

我有一個相當大的一維numpy數組,我希望對一個切片就地應用一些排序並檢索其他處理的排列矢量。numpy arrray的就地排列

但是,ndarray.sort()(它是一個就地操作)方法不會返回這個向量,我可以使用ndarray.argsort()方法來獲取置換向量並使用它來置換slice。但是,我無法弄清楚如何在原地進行。

Vslice = V[istart:istop] # This is a view of the slice 

iperm = Vslice.argsort() 

V[istart:istop] = Vslice[iperm] # Not an inplace operation... 

輔助問題:爲什麼下面的代碼不會修改V,因爲我們正在處理V的視圖?

Vslice = Vslice[iperm] 

祝好!

弗朗索瓦

回答

3

要回答你爲什麼分配給視圖不修改原題:

您需要更改Vslice = Vslice[iperm]Vslice[:] = Vslice[iperm]否則你是分配一個新值Vslice而非改變Vslice內部的值:

>>> a = np.arange(10, 0, -1) 
>>> a 
array([10, 9, 8, 7, 6, 5, 4, 3, 2, 1]) 
>>> b = a[2:-2] 
>>> b 
array([8, 7, 6, 5, 4, 3]) 
>>> i = b.argsort() 
>>> b[:] = b[i] # change the values inside the view 
>>> a   # note `a` has been sorted in [2:-2] slice 
array([10, 9, 3, 4, 5, 6, 7, 8, 2, 1]) 
+0

謝謝!簡單... – frongere

+2

請注意,即使結果寫回到原始數組,操作也不會「就地」發生:按照排序順序創建子數組的副本,然後寫回其內容到原始數組。 – Jaime

+0

@Jaime確實如此。這本應該回答這篇文章中的最後一個問題 –