【问题标题】:Difference between two numpy arrays of tuples两个numpy元组数组之间的区别
【发布时间】:2019-11-26 14:51:02
【问题描述】:

我有 numpy ndarray wall,它由元组 brick = (x, y, w, h) 组成。

看起来像

[[317. 276.  17.  12.]
[317. 276.  17.  12.]
[317. 276.  17.  12.]
[248. 276.  25.  17.]
[320. 274.  18.  13.]
[353. 273.  15.  11.]
[377. 272.  17.  11.]
[  0. 271.  61.  71.]
[ 21. 266.  75.  49.]
[228. 280.  20.  14.]
[306. 245.  15.  20.]
[519. 239.  18.  18.]
[482. 252.  22.  10.]]

我想消除相同的,因为你可以看到前三个是相同的。之后每次新迭代(相机回调 - 帧接收)我都有新的wall。我想把这个和旧的比较一下,找出不同之处,基本上找到所有不同的brick。不幸的是,intersection/unique 或其他严格的方法对我不起作用。任何提示将不胜感激。

【问题讨论】:

  • np.unique 确实有一个 axis 参数,所以你能详细说明为什么你不能使用它吗?另外我不明白为什么你有一个元组数组而不是一个二维数组(根据你显示的输出,你似乎有)。
  • 因为我收到了wall 作为cv2.trackers.update 的结果。我无法解决的问题是 np.unique 返回包含所有唯一元素的一维数组,而不是唯一的砖块。
  • 请注意,每个数字中的点表示您的数组具有浮点数。如果您只有整数,请在创建数组时传递 dtype=int 以获得整数数组。
  • 这不是你想要的吗?如果您的数组是dtype=object 并且包含砖块作为任何对象,只要它们支持==,您就可以使用np.unique(a),它将为您提供一组独特的砖块对象。从您的问题看来,这就是您所要求的。如果没有,您能否使用可重现(即复制和粘贴)代码以及预期输出来更新您的问题。

标签: python numpy compare tuples unique


【解决方案1】:

从您的问题和 cmets 看来,您希望沿第一个轴删除唯一元素。您可以通过np.unique 指定axis=0 来执行此操作:

np.unique(wall, axis=0)

如果wall.dtype is object 并存储了某种brick 对象,只要它们支持相等检查== (__eq__),就可以使用np.unique(a)

【讨论】:

    【解决方案2】:

    Pandas 是一个很好的库。可能不是最有效的方法,但它可以完成工作。

    import pandas as pd
    
    tmp = [
        [317, 276,  17,  12.],
        [317, 276,  17,  12.],
        [317, 276,  17,  12.],
        [248, 276,  25,  17.],
        [320, 274,  18,  13.],
        [353, 273,  15,  11.],
        [377, 272,  17,  11.],
        [  0, 271,  61,  71.],
        [ 21, 266,  75,  49.],
        [228, 280,  20,  14.],
        [306, 245,  15,  20.],
        [519, 239,  18,  18.],
        [482, 252,  22,  10.]
    ]
    
    df = pd.DataFrame(tmp).drop_duplicates()
    

    输出是:

        0   1   2   3
    0   317 276 17  12.0
    3   248 276 25  17.0
    4   320 274 18  13.0
    5   353 273 15  11.0
    6   377 272 17  11.0
    7   0   271 61  71.0
    8   21  266 75  49.0
    9   228 280 20  14.0
    10  306 245 15  20.0
    11  519 239 18  18.0
    12  482 252 22  10.0
    

    【讨论】:

    • 这似乎是合法的,会尝试这种方式。
    • 这与使用np.unique(a, axis=0) 有何不同?
    • Pandas 会保持行的有序,而 numpy 不会。如果这不是问题,那么 numpy 方法可能确实更好。
    • 好吧,实际上经过测试np.unique(a,axis=0) 最适合我。非常感谢,伙计们。
    猜你喜欢
    • 2014-02-26
    • 2018-08-07
    • 2016-05-17
    • 2016-05-18
    • 1970-01-01
    • 2015-02-18
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多