【问题标题】:Equivalent of 'ismember' from Matlab in Python? [duplicate]相当于 Python 中 Matlab 中的“ismember”? [复制]
【发布时间】:2011-04-18 23:52:56
【问题描述】:

我正在尝试对具有相同列数的两个矩阵 A 和 B 的行进行比较。

在 matlab 中,命令ismember(a, b, 'rows') 返回一个包含 1 的向量,其中 A 的行也是 B 的行,否则为 0,并且还为 A 中属于 B 的每个元素返回 B 中的最高索引。

[tf, index] = ismember(A, B, 'rows');

python中有没有等价的函数?有什么想法吗?

【问题讨论】:

    标签: python matlab


    【解决方案1】:

    你可以得到你的向量

    same_rows = [a == b for a,b in zip(A, B)]
    

    请注意,这将产生 TrueFalse 而不是 1 和 0,但 boolintTrue == 1False == 0 的子类。

    要获得发生这种情况的最大行,您可以使用

    max_row = next(i for i, row in enumerate(reversed(same_rows)) if row == True)
    

    如果你想要它们共有的行数,你可以使用

    same_count == sum(same_rows)
    

    请注意,这仅适用于 python,并假定矩阵是列表或元组的列表或列表或元组的元组。 HTH。

    【讨论】:

    • 或者你可以只使用map( eq, A, B) 使用eq from operator,还要注意在 Python 3.x 中 bool 不再是 int 而是它自己的类型。
    • @wheaties: bool 仍然是一个 int,在 Python 3 中。事实上,issubclass(bool, int) 返回 True。您可以查看完整的讨论:stackoverflow.com/questions/2764017/…
    • 请注意,same_rows = [a == b for a,b in zip(A, B)],只给我收益 True,其中行仅在相应行处相等(例如 a[0, :] = b[0,:]) 但我需要找到 a 行在 b 中的所有位置。
    【解决方案2】:

    ismember 库会很有帮助。

    pip install ismember
    

    例子:

    # Import library
    from ismember import ismember
    
    # Example with random matrices
    a_vec = np.random.randint(0,10,(5,8))
    b_vec = np.random.randint(0,10,(5,10))
    
    # Row-wise comparison
    Iloc, idx = ismember(a_vec, b_vec, 'rows')
    
    # These should all be True
    for i in np.arange(0,a_vec.shape[0]):
        np.all(a_vec[i,Iloc[i]]==b_vec[i,idx[i]])
    

    【讨论】:

      猜你喜欢
      • 2013-01-27
      • 2014-11-13
      • 2013-05-15
      • 2013-03-29
      • 1970-01-01
      • 2014-02-23
      • 2023-03-17
      • 2016-10-14
      • 1970-01-01
      相关资源
      最近更新 更多