【发布时间】:2016-11-29 03:36:05
【问题描述】:
我有一个数组[0.2,0,0,0,0.3,0,0,0,0.4]。我正在使用np.argsort 对值进行排序并获取该索引。
因此,在我的示例中,它将类似于 [1,5,9,2,3,4,6...]。但是,我只想获取非零值的索引数组。
在我的例子中只有[1,5,9]。
如何在 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]。
如何在 python 中使用pandas 和numpy 实现它?
【问题讨论】:
使用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])
【讨论】:
一行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])
【讨论】:
你可以试试:
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])
【讨论】:
您可以用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)
【讨论】: