代码之家  ›  专栏  ›  技术社区  ›  Majoris

numpy数组的唯一行,同时保留其顺序

  •  0
  • Majoris  · 技术社区  · 2 年前

    如何在保留结果中行的(首次出现的)顺序的同时获得数组的唯一行?

    下面的代码尝试了产生单个数组的变体。
    array_equal 与元素位置进行比较。

    import numpy as np
    unique = np.array([])
    arr = np.array([[1,2,3,4,5],[3,4,5,6,7],[5,6,7,8,9],[7,8,9,0,1],[9,0,1,2,3],[1,2,3,4,5],[-8,-7,-6,-5,-4]])
    
    u = 0
    for idx, i in enumerate(arr):
           if np.array_equal(unique, i) == False:
            unique = np.append(unique, i, axis=None)
            u += 1
    
    print (unique)
    print(u)
    
    >>> print (unique)
    [ 1.  2.  3.  4.  5.  3.  4.  5.  6.  7.  5.  6.  7.  8.  9.  7.  8.  9.
      0.  1.  9.  0.  1.  2.  3.  1.  2.  3.  4.  5. -8. -7. -6. -5. -4.]
    >>> print(u)
    7
    >>>
    

    对于本例,预期的结果是一个具有6个唯一行的数组。

    [[1,2,3,4,5],[3,4,5,6,7],[5,6,7,8,9],[7,8,9,0,1],[9,0,1,2,3],[-8,-7,-6,-5,-4]]
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   jared    2 年前

    这可以通过简单地传递 axis=0 的论点 np.unique ,告诉numpy将这些行相互比较。要保留您可以遵循的顺序 this answer ,从而获得唯一索引,并使用这些索引(一旦排序)来选择 arr

    import numpy as np
    
    arr = np.array([[ 1,  2,  3,  4,  5],
                    [ 3,  4,  5,  6,  7],
                    [ 5,  6,  7,  8,  9],
                    [ 7,  8,  9,  0,  1],
                    [ 9,  0,  1,  2,  3],
                    [ 1,  2,  3,  4,  5],
                    [-8, -7, -6, -5, -4]])
    _, idx = np.unique(arr, axis=0, return_index=True)
    unique = arr[np.sort(idx)]
    print(unique)
    

    输出:

    [[ 1  2  3  4  5]
     [ 3  4  5  6  7]
     [ 5  6  7  8  9]
     [ 7  8  9  0  1]
     [ 9  0  1  2  3]
     [-8 -7 -6 -5 -4]]