Python:相当于 Matlab ismember on rows for large arrays

Python : equivalent of Matlab ismember on rows for large arrays

我找不到一种有效的方法来使用 Python 执行 Matlab 的“ismember(a,b,'rows')”,其中 a 和 b 是大小为 (ma,2) 的数组, (mb,2) 分别为 m 为偶数。

ismember 模块 (https://pypi.org/project/ismember/) 崩溃是因为在某些时候,即在执行 np.all(a[:, None] == b, axis=2).any( axis=1) 它需要创建一个大小为 (ma,mb,2) 的数组,但它太大了。此外,即使该函数有效(因为数组足够小),它也比在 Matlab 中慢大约 100 倍。我猜这是因为 Matlab 使用了内置的 mex 函数。为什么 python 没有我认为如此重要的功能?我在计算中无数次使用它...

ps :此处提出的解决方案 Python version of ismember with 'rows' and index 不对应于真正的 matlab ismember 函数,因为它不能逐个元素地工作,即它不验证 [= 的几个值20=] 存在于 'b' 中,但前提是 'a' 的每一列的值都存在于 'b'.

的每一列中

您可以使用 np.unique(array,axis=0) 来查找数组的相同行。因此,使用此功能,您可以将 2D 问题简化为 1D 问题,可以使用 np.isin():

轻松解决
import numpy as np

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

# ismember_row function, which rows of a are in b:
def ismember_row(a,b):
    # Get the unique row index
    _, rev = np.unique(np.concatenate((b,a)),axis=0,return_inverse=True)
    # Split the index
    a_rev = rev[len(b):]
    b_rev = rev[:len(b)]
    # Return the result:
    return np.isin(a_rev,b_rev)

res = ismember_row(a,b)
# res = array([False,  True])