2016-11-29 4 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]です。

pandasnumpyを使用してPythonで実装するにはどうすればよいですか?

答えて

3

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

sparse_argsort(a) 

array([0, 4, 8]) 

1ライナー:

(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

1つのライナーを行う「ラムダ」がきれいです! – Boud

3

1行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

あなたはとにかくcondition.nonzero()に、numpy.whereでそれ以降のデフォルトを少しカンニングすることができます。 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)