np.argsort,不包括零值

时间:2016-11-29 03:36:05

标签: python pandas numpy

我有一个数组[0.2,0,0,0,0.3,0,0,0,0.4]。我使用np.argsort对值进行排序并获取索引。

因此,对于我的例子,它将类似于[1,5,9,2,3,4,6...]。但是,我想仅为非零值获取索引数组。

仅在我的示例中[1,5,9]

如何使用pandasnumpy

在python中实现它

4 个答案:

答案 0 :(得分: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])

答案 1 :(得分: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 :(得分: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])

答案 3 :(得分: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)