过滤numpy数组以仅为给定值保留一行

时间:2018-01-18 21:13:24

标签: python arrays numpy

我有一个大的n x 2 numpy数组,格式为(x,y)坐标。我想过滤这个数组,以便:

  1. 识别具有重复x值的坐标对。
  2. 只保留那些具有最高y值的重复的坐标对。
  3. 例如,在以下数组中:

    arr = [[1, 4]
           [1, 8]
           [2, 3]
           [4, 6]
           [4, 2]
           [5, 1]
           [5, 2]
           [5, 6]]
    

    我希望结果是:

    arr = [[1, 8]
           [2, 3]
           [4, 6]
           [5, 6]]
    

    我已经探索过np.unique和np.where,但无法弄清楚如何利用它们来解决这个问题。非常感谢!

1 个答案:

答案 0 :(得分:3)

这是基于np.maximum.reduceat -

的一种方式
def grouby_maxY(a):
    b = a[a[:,0].argsort()] # if first col is already sorted, skip this
    grp_idx = np.flatnonzero(np.r_[True,(b[:-1,0] != b[1:,0])])
    grp_maxY = np.maximum.reduceat(b[:,1], grp_idx)
    return np.c_[b[grp_idx,0], grp_maxY]

或者,如果您想带np.unique,我们可以使用grp_idx查找np.unique(b[:,0], return_index=1)[1]

示例运行 -

In [453]: np.random.seed(0)

In [454]: arr = np.random.randint(0,5,(10,2))

In [455]: arr
Out[455]: 
array([[4, 0],
       [3, 3],
       [3, 1],
       [3, 2],
       [4, 0],
       [0, 4],
       [2, 1],
       [0, 1],
       [1, 0],
       [1, 4]])

In [456]: grouby_maxY(arr)
Out[456]: 
array([[0, 4],
       [1, 4],
       [2, 1],
       [3, 3],
       [4, 0]])