【问题标题】:Comparing rows of a multidimesional array in python在python中比较多维数组的行
【发布时间】:2015-12-10 03:32:12
【问题描述】:

我有两个 numpy 数组

a= np.array([[2,2],[3,2],[4,2],[3,3],[5,3]])
b= np.array([[1,1],[1,3],[5,3]])

我想比较 a 和 b 并返回 a-b 这样:

a-b = array([[2,2],
             [3,2],
             [4,2],
             [3,3]]) 

我已经尝试过:

[x for x in a if x not in b] 

结果是

[array([2, 2]), array([3, 2]), array([4, 2])] # where clearly [3,3] is missing

我什至尝试在循环中比较 a 和 b 的每一行,它给了我一个错误

The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

谁能帮我解决这个问题???

【问题讨论】:

  • 你的输出背后有什么逻辑吗?
  • 您要进行的比较到底是什么?这不是减法,不是成员资格,也不是索引。看起来您的输出只是a 的前四个元素。我根本无法弄清楚它与b 的关系。
  • 比较'a'的行和'b'..返回'a'的行与'b'的行不匹配

标签: python arrays list numpy scipy


【解决方案1】:

执行此操作的一种方法是将 numpy 数组转换为元组列表,并将 b 转换为元组集,然后执行您在它们上使用的相同列表推导。示例 -

In [1]: import numpy as np

In [2]: a= np.array([[2,2],[3,2],[4,2],[3,3],[5,3]])

In [3]: b= np.array([[1,1],[1,3],[5,3]])

In [18]: alist = list(map(tuple, a))

In [19]: bset = set(map(tuple, b))

In [20]: np.array([x for x in alist if x not in bset])
Out[20]:
array([[2, 2],
       [3, 2],
       [4, 2],
       [3, 3]])

【讨论】:

    【解决方案2】:

    Broadcasting 基于矢量化方法 -

    a[~((b[:,None,:] == a).all(2)).any(0)]
    

    使用来自scipy.spatial.distancecdist -

    from scipy.spatial.distance import cdist
    
    a[~(cdist(a,b)==0).any(1)]
    

    示例运行 -

    In [89]: a
    Out[89]: 
    array([[2, 2],
           [3, 2],
           [4, 2],
           [3, 3],
           [5, 3]])
    
    In [90]: b
    Out[90]: 
    array([[1, 1],
           [1, 3],
           [5, 3]])
    
    In [91]: a[~((b[:,None,:] == a).all(2)).any(0)]
    Out[91]: 
    array([[2, 2],
           [3, 2],
           [4, 2],
           [3, 3]])
    
    In [92]: a[~(cdist(a,b)==0).any(1)]
    Out[92]: 
    array([[2, 2],
           [3, 2],
           [4, 2],
           [3, 3]])
    

    【讨论】:

      猜你喜欢
      • 2019-06-27
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多