因此,我有一个字符串的numpy数组,我想使用此函数计算每对元素之间的成对编辑距离:http://docs.scipy.org/doc/scipy-0.13.0/reference/generated/scipy.spatial.distance.pdist.html的scipy.spatial.distance.pdist
我的数组的示例如下:
>>> 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
最佳答案
如果确实必须使用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 ...