np.argsort排除零值

use*_*023 6 python numpy pandas

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

因此,以我的示例为例[1,5,9,2,3,4,6...]。但是,我只想获取非零值的索引数组。

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

如何使用pandas和在python中实现它numpy

Kh4*_*tiK 7

使用np.nonzero和索引技巧

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

sparse_argsort(a)

array([0, 4, 8])
Run Code Online (Sandbox Code Playgroud)

一个班轮:

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

array([0, 4, 8])
Run Code Online (Sandbox Code Playgroud)


piR*_*red 5

一行numpy

np.where(a != 0, a, np.nan).argsort()[:(a != 0).sum()]
Run Code Online (Sandbox Code Playgroud)

同样的逻辑,两行,效率更高

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

array([0, 4, 8])
Run Code Online (Sandbox Code Playgroud)