【问题标题】:Filter numpy array to retain only one row for a given value过滤 numpy 数组以仅保留给定值的一行
【发布时间】:2018-07-07 03:45:23
【问题描述】:

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

  1. 识别具有重复 x 值的坐标对。
  2. 只保留那些具有最高 y 值的副本的坐标对。

例如,在以下数组中:

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 但无法弄清楚如何利用它们来解决这个问题。非常感谢!

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    这是基于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_idxnp.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]])
    

    【讨论】:

    • 我认为如果您分解函数 groupby_maxY 的最后两个语句所做的事情会很有帮助。
    • @Ram 好主意!已编辑。
    • @Divakar 这非常有效 - 谢谢!接受的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 2021-08-04
    • 1970-01-01
    相关资源
    最近更新 更多