2016-11-29 70 views
3

我有一個數組[0.2,0,0,0,0.3,0,0,0,0.4]。我使用np.argsort對值進行排序並獲取該索引。排除零值的np.argsort

所以,就我的例子而言,它會像[1,5,9,2,3,4,6...]。但是,我想獲得非零值的索引數組。

在我的例子中只有[1,5,9]

如何在Python中使用pandasnumpy來實現它?

回答

3

使用np.nonzero和索引招

def sparse_argsort(arr): 
    indices = np.nonzero(arr)[0] 
    return indices[np.argsort(arr[indices])] 

sparse_argsort(a) 

array([0, 4, 8]) 

一個班輪:

(lambda a: (lambda a_, i_: i_[np.argsort(a_[i_])])(a,np.nonzero(a)[0]))(a) 

array([0, 4, 8]) 
2

你可以試試:

pd.Series([0.2,0,0,0,0.3,0,0,0,0.4]).sort_values()[lambda x: x != 0].index.values 
# array([0, 4, 8]) 

或者使用numpy

ind = arr.argsort() 
ind[arr[ind] != 0] 

# array([0, 4, 8]) 
+1

做一個班輪的「lambda作爲過濾器」是整潔的! – Boud

3

一行numpy的

np.where(a != 0, a, np.nan).argsort()[:(a != 0).sum()] 

同樣的邏輯,兩條線,更高效的

nz = a != 0 
np.where(nz, a, np.nan).argsort()[:nz.sum()] 

array([0, 4, 8]) 
0

你可以欺騙一個位與numpy.where,因爲它默認爲condition.nonzero()反正。使用numpy.in1d構建一個蒙版。

x=[0.2,0,0,0,0.3,0,0,0,0.4] 

np.argsort(x)[np.in1d(np.argsort(x),np.where(x),1)] 

Out[35]: array([0, 4, 8], dtype=int32)