python - 比较矩阵中的行并计算相等元素的数量
问题描述
我想知道是否有一种有效的方法来比较矩阵中的行并计算行中相等元素的数量。假设我有一个矩阵:
[['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 是否有更有效的解决方案?
解决方案
通过使用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)
推荐阅读
- java - 使用昼夜主题时如何更改布局的背景/文本颜色
- html - 无法使项目 (3) 居中于其他元素 (3)、flexbox 的顶部
- ios - TableView 不会在情节提要中拉伸到全屏
- apache-kafka - Kafka可以将消费者组偏移量设置为主题的开头吗?
- java - 如何在泛型类中设置随机值
- dart - 在 PageController 中动态更改 viewportFraction
- mongodb - 推送到子数组的最后一个元素
- python - 从路径加载大量图像并将其转换为大小为 (n,224,224,3) 的数组
- php - 如何从数组中删除新行之后的单词?
- c++ - openssl - 无法计算许多文件的哈希