【问题标题】:np.argsort which excludes zero valuesnp.argsort 排除零值
【发布时间】: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 中使用pandasnumpy 实现它?

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    使用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】:

      一行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])
      

      【讨论】:

        【解决方案3】:

        你可以试试:

        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])
        

        【讨论】:

        • “作为过滤器的 lambda” 做一个内衬很整洁!
        【解决方案4】:

        您可以用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)
        

        【讨论】:

          猜你喜欢
          • 2019-08-28
          • 2013-10-29
          • 2013-07-27
          • 1970-01-01
          • 1970-01-01
          • 2022-06-29
          • 2020-03-23
          • 2021-10-23
          • 1970-01-01
          相关资源
          最近更新 更多