【问题标题】:Compare rows in a matrix and count the number of equal elements比较矩阵中的行并计算相等元素的数量
【发布时间】:2021-02-10 18:29:57
【问题描述】:

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

[['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?

【问题讨论】:

  • sum(matrix[i]==matrix[j]) 你不是要在这里求和一个布尔值吗?
  • 不确定,但它有效!

标签: python numpy


【解决方案1】:

通过使用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)

【讨论】:

    猜你喜欢
    • 2013-05-04
    • 2020-03-23
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多