【问题标题】:How to sort unsort: array(1).sort transform of array(2) -> array(3).unsort (reversed array(1).sort如何对 unsort 进行排序:array(1).sort 对 array(2) 的变换 -> array(3).unsort (reversed array(1).sort
【发布时间】:2017-03-13 19:25:15
【问题描述】:

如何对结果进行排序、操作和取消排序?

假设我有一个浮点数组p1 = 0.15,0.3, 0.25, 0.12, ...。排序为:p2 = sort(p1)。一个函数(以p2 作为输入的操作)导致p3p3 = f(p2, x, y, ...) 用于某些函数f

如何以最聪明的方式取消对p3 的排序? (与 p1 的排序方式相反)

即:p4 = unsort(p3) p4 未排序到与p1 相同的顺序,以便与p1 进行比较(x-plot)?

【问题讨论】:

    标签: python sorting numpy


    【解决方案1】:

    您需要在这里使用双 argsort 来保持顺序:

    In [6]: a
    Out[6]: array([5, 4, 8, 3, 6, 1, 2, 4, 9, 6])
    
    In [7]: b=sort(a)
    
    In [8]: b
    Out[8]: array([1, 2, 3, 4, 4, 5, 6, 6, 8, 9])
    
    In [9]: ii=a.argsort().argsort()
    
    In [10]: c=b*b
    
    In [11]: c
    Out[11]: array([ 1,  4,  9, 16, 16, 25, 36, 36, 64, 81])
    
    In [12]: c[ii]
    Out[12]: array([25, 16, 64,  9, 36,  1,  4, 16, 81, 36])
    

    【讨论】:

    【解决方案2】:

    一种方法是使用numpy.argsort 来查找将对您的初始数组进行排序的索引。相同的索引可用于将数组取消排序到其结果中,如下所示:

    a = np.array([5, 2, 4, 3, 1])
    i = np.argsort(a)    # i = array([4, 1, 3, 2, 0])
    
    # b will be the sorted version of a    
    b = a[i]             # b = array([1, 2, 3, 4, 5])
    # c is the function on b
    c = b**2             # c = array([ 1,  4,  9, 16, 25])
    
    # d will hold the un-sorted result
    d = np.empty(a.shape)
    d[i] = c             # d = array([ 25.,   4.,  16.,   9.,   1.])
    

    但这需要您在索引之前预先声明d

    【讨论】:

      【解决方案3】:

      使用内置函数在 python 中对列表进行排序:

      程序:

      a=[589,273,981,642,702,883,319,128]
      print("a",a)
      b=[(p[1],p[0]) for p in enumerate(a)]
      print("b",b)
      c=sorted(b)
      print("c",c)
      d=[p[1] for p in c]
      z=[p[0] for p in c]
      print("d",d)
      print("z",z)
      y=zip(d,z)
      print("y",y)
      x=list(y)
      print("x",x)
      w=sorted(x)
      print("w",w)
      v=[p[1] for p in w]
      print("v",v)
      # unsort of z in one statement:
      u=[r[1] for r in
          sorted(list(zip([q[1] for q in
              sorted([(p[1],p[0]) for p in
                  enumerate(a)])],z)))]  
      

      输出:

      a [589, 273, 981, 642, 702, 883, 319, 128]
      b [(589, 0), (273, 1), (981, 2), (642, 3), (702, 4), (883, 5), (319, 6), (128, 7)]
      c [(128, 7), (273, 1), (319, 6), (589, 0), (642, 3), (702, 4), (883, 5), (981, 2)]
      d [7, 1, 6, 0, 3, 4, 5, 2]
      z [128, 273, 319, 589, 642, 702, 883, 981]
      y <zip object at 0x035E38A0>
      x [(7, 128), (1, 273), (6, 319), (0, 589), (3, 642), (4, 702), (5, 883), (2, 981)]
      w [(0, 589), (1, 273), (2, 981), (3, 642), (4, 702), (5, 883), (6, 319), (7, 128)]
      v [589, 273, 981, 642, 702, 883, 319, 128]   
      u [589, 273, 981, 642, 702, 883, 319, 128]   
      

      【讨论】:

        猜你喜欢
        • 2016-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多