我有一個數組[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]
。
如何在Python中使用pandas
和numpy
來實現它?
我有一個數組[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]
。
如何在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])
你可以試試:
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的
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])
你可以欺騙一個位與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)
做一個班輪的「lambda作爲過濾器」是整潔的! – Boud