Python中等效于Matlab的'ismember'?
我想对两个矩阵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)]
注意,这样会得到 True
和 False
,而不是 1 和 0。不过 bool
是从 int
继承来的,所以 True == 1
和 False == 0
是成立的。
要找出出现这种情况的最大行数,你可以直接使用:
max_row = next(i for i, row in enumerate(reversed(same_rows)) if row == True)
如果你想知道它们共有多少行,可以直接使用:
same_count == sum(same_rows)
请注意,这些内容都是针对 Python 的,并假设矩阵是由列表或元组组成的列表,或者是由列表或元组组成的元组。希望对你有帮助。