本文介绍了过滤 numpy 数组以仅保留给定值的一行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个很大的 n x 2 numpy 数组,它的格式为 (x, y) 坐标.我想过滤这个数组以便:
I have a large n x 2 numpy array that is formatted as (x, y) coordinates. I would like to filter this array so as to:
- 识别具有重复 x 值的坐标对.
- 仅保留具有最高 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,但不知道如何利用它们来解决这个问题.非常感谢!
Ive explored np.unique and np.where but cannot figure out how to leverage them to solve this problem. Thanks so much!
推荐答案
这里有一种方法基于 np.maximum.reduceat
-
Here's one way based on 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
,我们可以用np.unique(b[:,0],return_index=1)[1]
.
Alternatively, if you want to bring np.unique
, we can use it to find grp_idx
with 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]])
这篇关于过滤 numpy 数组以仅保留给定值的一行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!