【问题标题】:Python3: Remove array elements with same coordinate (x,y)Python3:删除具有相同坐标(x,y)的数组元素
【发布时间】:2020-08-14 12:59:31
【问题描述】:

我有这个数组 (x,y,f(x,y)):

a=np.array([[ 1,  5,  3],
   [ 4,  5,  6],
   [ 4,  5, 6.1],
   [ 1,  3, 42]])

我想删除具有相同 x,y 的重复项。在我的数组中,我有 (4,5,6) 和 (4,5,6.1),我想删除其中一个(没有标准)。

如果我有 2 列 (x,y),我可以使用

np.unique(a[:,:2], axis = 0) 

但我的数组有 3 列,我不知道如何以简单的方式执行此操作。
我可以做一个循环,但我的数组可能非常大。

有没有办法更有效地做到这一点?

【问题讨论】:

  • 请给我们一个您的 3-D 输入和所需输出的示例。谢谢

标签: python arrays python-3.x numpy numpy-ndarray


【解决方案1】:

如果我理解正确,你需要这个:

a[np.unique(a[:,:2],axis=0,return_index=True)[1]]

输出:

[[ 1.  3. 42.]
 [ 1.  5.  3.]
 [ 4.  5.  6.]]

请注意,它不会保留 a 中的原始行顺序。如果您想保持顺序,只需对索引进行排序:

a[np.sort(np.unique(a[:,:2],axis=0,return_index=True)[1])]

输出:

[[ 1.  5.  3.]
 [ 4.  5.  6.]
 [ 1.  3. 42.]]

【讨论】:

    【解决方案2】:

    我想你想这样做?

    • np.rint 会将您的数字四舍五入为整数

    import numpy as np
    
    a = np.array([
       [ 1,  5,  3],
       [ 4,  5,  6],
       [ 4,  5, 6.1],
       [ 1,  3, 42]
       ])
    
    a = np.unique(np.rint(a), axis = 0) 
    
    print(a)
    
    //result :
    [[ 1.  3. 42.]
     [ 1.  5.  3.]
     [ 4.  5.  6.]]
    

    【讨论】:

    • 这是一个好方法,但是,是否可以在删除重复项后恢复它们以前的值(在进行舍入之前)?
    • 你可以这样做 b = np.unique(np.rint(a), axis = 0) 这样你的原始数组就不会被覆盖。但为什么?如果您有一堆坐标,我根本不会使用np.rint,而只需使用np.unique 函数
    • 是的,我可以这样做,然后您必须以某种方式更新 b 的值。我想要没有四舍五入值的最终结果。但是没有np.rint,我无法删除具有相同 x 和 y 的重复项。
    • 通过return_index=True 获取索引并使用这些索引对a 进行切片。
    • _, idx = np.unique(np.rint(a), axis=0, return_index=True); b=a[idx].copy().
    猜你喜欢
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 2012-05-13
    相关资源
    最近更新 更多