我有一个大约 100 万个唯一的 16 个字符的字符串列表(一个称为 VEC 的数组),我想计算 Python 中每个字符串的最小成对汉明距离(一个称为 RES 的数组)。基本上,我一次计算一行完整的成对距离矩阵,但只将每行的最小值存储在 RES 中。
VEC= ['AAAAAAAAAAAAAAAA','AAAAAAAAAAAAAAAT','AAAAGAAAAAATAAAA'...]
因此 dist(VEC[1],VEC[2])=1, dist(VEC[1],VEC[3])=2 等等...并且 RES[1]=1。使用这些页面中的提示和技巧,我想出了:
#METHOD#1:
import Levenshtein
import numpy
RES=99*numpy.ones(len(VEC))
i=0
for a in VEC:
dist=numpy.array([Levenshtein.hamming(a,b) for b in VEC] ) #array of distances
RES[i]=numpy.amin(dist[dist>0]) #pick min distance greater than zero
i+=1
一个只有 10,000 的缩短 VEC 大约需要 70 秒,但如果我将其推断为整百万,则需要 8 天。我的方法似乎很浪费,因为我正在重新计算距离矩阵的对称部分,所以我尝试计算矩阵的一半,同时更新每一行的 RES:
#METHOD #2:
import Levenshtein
import numpy
RES=99*numpy.ones(len(VEC))
for i in range(len(VEC)-1):
dist=[Levenshtein.hamming(VEC[i],VEC[j]) for j in range(i+1, len(VEC))]
RES[i]=min(numpy.amin(dist),RES[i])
#update RES as you go along:
k=0
for j in range(i+1,len(VEC)):
if dist[k]<RES[j]:
RES[j]=dist[k]
k+=1
可能并不奇怪,第二种方法需要几乎两倍的时间(117 秒),所以它不是很好。无论如何,任何人都可以推荐改进/更改以使其更快吗?