Python中等效于Matlab的'ismember'?

2 投票
2 回答
2560 浏览
提问于 2025-04-16 04:46

我想对两个矩阵A和B的行进行比较,它们的列数是一样的。

在matlab中,命令ismember(a, b, 'rows')会返回一个向量,其中1表示A的行也在B中出现,0则表示没有出现。同时,它还会返回每个在B中存在的A的元素在B中的最高索引。

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

在python中有没有类似的功能?有什么想法可以实现吗?

2 个回答

1

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]])
4

你可以这样获取你的向量:

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

注意,这样会得到 TrueFalse,而不是 1 和 0。不过 bool 是从 int 继承来的,所以 True == 1False == 0 是成立的。

要找出出现这种情况的最大行数,你可以直接使用:

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

如果你想知道它们共有多少行,可以直接使用:

same_count == sum(same_rows)

请注意,这些内容都是针对 Python 的,并假设矩阵是由列表或元组组成的列表,或者是由列表或元组组成的元组。希望对你有帮助。

撰写回答