Python NumPy 成对编辑距离
我有一个包含字符串的numpy数组,我想用这个函数来计算数组中每一对元素之间的编辑距离,函数是:scipy.spatial.distance.pdist,具体可以参考这个链接:http://docs.scipy.org/doc/scipy-0.13.0/reference/generated/scipy.spatial.distance.pdist.html
我的数组示例是这样的:
>>> d[0:10]
array(['TTTTT', 'ATTTT', 'CTTTT', 'GTTTT', 'TATTT', 'AATTT', 'CATTT',
'GATTT', 'TCTTT', 'ACTTT'],
dtype='|S5')
不过,由于这个函数没有提供'editdistance'这个选项,所以我想自己定义一个距离函数。我尝试了这样做,但遇到了以下错误:
>>> import editdist
>>> import scipy
>>> import scipy.spatial
>>> scipy.spatial.distance.pdist(d[0:10], lambda u,v: editdist.distance(u,v))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/epd-7.3.2/lib/python2.7/site-packages/scipy/spatial/distance.py", line 1150, in pdist
[X] = _copy_arrays_if_base_present([_convert_to_double(X)])
File "/usr/local/epd-7.3.2/lib/python2.7/site-packages/scipy/spatial/distance.py", line 153, in _convert_to_double
X = np.double(X)
ValueError: could not convert string to float: TTTTT
2 个回答
-4
这段内容是一个代码片段,使用的是JavaScript语言。代码块被标记为
def my_pdist(data,f):
N=len(data)
matrix=np.empty([N*(N-1)/2])
ind=0
for i in range(N):
for j in range(i+1,N):
matrix[ind]=f(data[i],data[j])
ind+=1
return matrix
,里面应该包含一些具体的代码内容。不过在这里,我们并没有看到具体的代码,只是一个占位符。简单来说,这个地方是用来放代码的,但现在还没有具体的代码展示出来。
4
如果你真的需要使用 pdist
,首先你得把你的字符串转换成数字格式。如果你知道所有的字符串长度都是一样的,这个转换其实挺简单的:
numeric_d = d.view(np.uint8).reshape((len(d),-1))
这个方法是把你的字符串数组看作一长串的 uint8
字节,然后重新排列,让每个原来的字符串单独占一行。在你的例子中,结果会是这样的:
In [18]: d.view(np.uint8).reshape((len(d),-1))
Out[18]:
array([[84, 84, 84, 84, 84],
[65, 84, 84, 84, 84],
[67, 84, 84, 84, 84],
[71, 84, 84, 84, 84],
[84, 65, 84, 84, 84],
[65, 65, 84, 84, 84],
[67, 65, 84, 84, 84],
[71, 65, 84, 84, 84],
[84, 67, 84, 84, 84],
[65, 67, 84, 84, 84]], dtype=uint8)
接下来,你就可以像平常一样使用 pdist
了。只要确保你的 editdist
函数是期待接收整数数组,而不是字符串。你可以通过调用 .tostring()
快速转换你的新输入:
def editdist(x, y):
s1 = x.tostring()
s2 = y.tostring()
... rest of function as before ...