首页 > 解决方案 > 比较矩阵中的行并计算相等元素的数量

问题描述

我想知道是否有一种有效的方法来比较矩阵中的行并计算行中相等元素的数量。假设我有一个矩阵:

[['food', 'food', 'food'],
 ['food', 'food', 'drink'],
 ['food', 'food', 'drink']] 

我想比较第一行和第二行,第一行和第三行,第二行和第三行。无需两次比较两行,我不想将一行与自身进行比较。我想返回一个列表或数组,它与比较的数量(或类似的)一样长,并且包含每个比较的相等元素的数量。在这种情况下,我会得到:[2, 2, 3]。

我试过循环矩阵如下:

comparisons = [sum(matrix[i]==matrix[j]) for i in range(len(matrix)) for j in range(len(matrix)) if i < j] 

我担心如果矩阵的大小增加,这个解决方案会太慢。使用例如 NumPy 是否有更有效的解决方案?

标签: pythonnumpy

解决方案


通过使用itertools.chain.from_iterable

>>> list(chain.from_iterable(
         (matrix[i+1:] == row).sum(1) for i, row in enumerate(matrix[:-1])
        ))
[2, 2, 3]

定时:

# Method 1 [from the question]
>>> %timeit [sum(matrix[i]==matrix[j]) for i in range(len(matrix)) for j in range(len(matrix)) if i < j]
25.6 µs ± 1.21 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

# Method 2
>>> %timeit list(chain.from_iterable((matrix[i+1:] == row).sum(1) for i, row in enumerate(matrix[:-1])))
11.8 µs ± 320 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

推荐阅读