【发布时间】: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中有没有等价的函数?有什么想法吗?
【问题讨论】:
我正在尝试对具有相同列数的两个矩阵 A 和 B 的行进行比较。
在 matlab 中,命令ismember(a, b, 'rows') 返回一个包含 1 的向量,其中 A 的行也是 B 的行,否则为 0,并且还为 A 中属于 B 的每个元素返回 B 中的最高索引。
[tf, index] = ismember(A, B, 'rows');
python中有没有等价的函数?有什么想法吗?
【问题讨论】:
你可以得到你的向量
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,并假定矩阵是列表或元组的列表或列表或元组的元组。 HTH。
【讨论】:
map( eq, A, B) 使用eq from operator,还要注意在 Python 3.x 中 bool 不再是 int 而是它自己的类型。
issubclass(bool, int) 返回 True。您可以查看完整的讨论:stackoverflow.com/questions/2764017/…
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]])
【讨论】: