私は配列[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]
です。
pandas
とnumpy
を使用してPythonで実装するにはどうすればよいですか?
私は配列[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]
です。
pandas
とnumpy
を使用してPythonで実装するにはどうすればよいですか?
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])
あなたは試すことができます:
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行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])
とインデックスのトリックを使用して
あなたはとにかく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)
1つのライナーを行う「ラムダ」がきれいです! – Boud