代码之家  ›  专栏  ›  技术社区  ›  kmario23 Mazdak

在numpy数组中获取唯一行时保留顺序

  •  3
  • kmario23 Mazdak  · 技术社区  · 6 年前

    我有三个二维阵列 a1 , a2 a3

    In [165]: a1
    Out[165]: 
    array([[ 0,  1,  2],
           [ 3,  4,  5],
           [ 6,  7,  8],
           [ 9, 10, 11]])
    
    In [166]: a2
    Out[166]: 
    array([[ 9, 10, 11],
           [15, 16, 17],
           [18, 19, 20]])
    
    In [167]: a3 
    Out[167]: 
    array([[6, 7, 8],
           [4, 5, 5]])
    

    我把这些数组叠加成一个数组:

    In [168]: stacked = np.vstack((a1, a2, a3))
    
    In [170]: stacked 
    Out[170]: 
    array([[ 0,  1,  2],
           [ 3,  4,  5],
           [ 6,  7,  8],
           [ 9, 10, 11],
           [ 9, 10, 11],
           [15, 16, 17],
           [18, 19, 20],
           [ 6,  7,  8],
           [ 4,  5,  5]])
    

    现在,我想去掉重复的行。所以, numpy.unique 做这项工作。

    In [169]: np.unique(stacked, axis=0)
    Out[169]: 
    array([[ 0,  1,  2],
           [ 3,  4,  5],
           [ 4,  5,  5],
           [ 6,  7,  8],
           [ 9, 10, 11],
           [15, 16, 17],
           [18, 19, 20]])
    

    然而,这里有一个问题。获取唯一行时,原始订单将丢失。如何保留原始排序并保留唯一行?

    因此,预期输出应该是:

    array([[ 0,  1,  2],
           [ 3,  4,  5],
           [ 6,  7,  8],
           [ 9, 10, 11],
           [15, 16, 17],
           [18, 19, 20],
           [ 4,  5,  5]])
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   BENY    6 年前

    使用 return_index

    _,idx=np.unique(stacked, axis=0,return_index=True)
    
    stacked[np.sort(idx)]
    array([[ 0,  1,  2],
           [ 3,  4,  5],
           [ 6,  7,  8],
           [ 9, 10, 11],
           [15, 16, 17],
           [18, 19, 20],
           [ 4,  5,  5]])
    
        2
  •  0
  •   farhad    6 年前

    在得到叠加数组之后

    步骤1:获取已排序的唯一数组的行索引

    row_indexes = np.unique(stacked, return_index=True, axis=0)[1]
    

    注意:行索引包含已排序数组的索引

    第2步:现在用已排序的索引迭代堆栈数组

    sorted_index=sorted(row_indexes)
    new_arr=[]
    for i in range(len(sorted_index)):
        new_arr.append(stacked[sorted_index[i]]
    

    就是这样!!!!!!!

    推荐文章