首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -将列表(或元组)列表与单个元组/列表进行比较

Python -将列表(或元组)列表与单个元组/列表进行比较
EN

Stack Overflow用户
提问于 2021-10-27 12:29:44
回答 2查看 48关注 0票数 0

我开始构建一个文本相似性项目,在这个项目中,我获取一个名称列表(100,000+记录),并在较大的文本(文档)中找到最佳匹配。我已经使用过rapidfuzz和fuzzyset库来成功地做到这一点,我想看看是否有更快的方法来满足我的特定用例。使用三元语法和散列三元语法字符串。为了提高性能,我希望尽可能地避免循环(Pythonic)。下面是一个代码片段示例,其中a可能是文档的三元表示法,b可能是一个名称的表示法。

代码语言:javascript
复制
import numpy as np
a = np.array([(1,2,3), (1,3,3), (3,3,3), (3,3,4)])
b = np.array((1,2,3))
print(np.sum(a == b))

输出是6,但希望它是3,2,1,0,或者只是最大结果3。

编辑:

在更详细地研究这个问题时,元组的静态长度对于不同长度的名称不起作用。例如,MATTHEW表示为(MAT,ATT,TTH,THE,HEW),而CALEB表示为(CAL,ALE,LEB)。

当前的想法是,最好将文档分解为带有滑动窗口的三元组。或者是列表中所有名称的最大长度,或者是当前正在搜索的名称的大小。欢迎任何想法

EN

回答 2

Stack Overflow用户

发布于 2021-10-27 12:33:00

您可以使用axis参数

代码语言:javascript
复制
>>> np.sum(a==b, axis=1)
array([3, 2, 1, 0])

这将跨行求和,并返回一个一维数组。然后,要获得最大值,可以使用以下两种方法之一。

代码语言:javascript
复制
>>> np.max(np.sum(a==b, axis=1))
3
>>> np.sum(a==b, axis=1).max()
3
票数 1
EN

Stack Overflow用户

发布于 2021-10-27 12:35:25

由于您希望计算非零值,因此一种替代方法是使用np.count_nonzero

代码语言:javascript
复制
import numpy as np

a = np.array([(1, 2, 3), (1, 3, 3), (3, 3, 3), (3, 3, 4)])
b = np.array((1, 2, 3))
res = np.count_nonzero(a == b, axis=1)
print(res)

输出

代码语言:javascript
复制
[3 2 1 0]

之后,可以使用.max找到最大值

代码语言:javascript
复制
res.max()  # 3

对于不是很小的数组,这两种方法似乎在速度方面具有可比性,请参见下面的(不是非常彻底的)比较:

代码语言:javascript
复制
import numpy as np
a = np.array([(1, 2, 3), (1, 3, 3), (3, 3, 3), (3, 3, 4)] * 1000)
b = np.array((1, 2, 3))
%timeit np.count_nonzero(a == b, axis=1)
110 µs ± 744 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit np.sum(a == b, axis=1)
108 µs ± 379 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69738706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档