用Numpy构造Jaro(或Levenshtein)距离矩阵numpy.fromfunction

2024-05-16 08:35:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在正在做一些文本分析,作为其中的一部分,我需要得到一个特定列表中所有单词之间的Jaro距离矩阵(因此成对距离矩阵)如下:

       │CHEESE CHORES GEESE  GLOVES
───────┼───────────────────────────
CHEESE │    0   0.222  0.177  0.444     
CHORES │0.222       0  0.422  0.333
GEESE  │0.177   0.422      0  0.300
GLOVES │0.444   0.333  0.300      0

所以,我试图用numpy.fromfunction来构造它。构造矩阵,并将其结果传递给每个函数。在

我尝试了以下方法:

^{pr2}$

注意:jaro嫒distance只接受2个字符串并返回一个浮点值。在

我得到一个错误:

File "<pyshell#26>", line 4, in distance
    return 1 - jaro_distance(feature_dict[i], feature_dict[j])
TypeError: only integer arrays with one element can be converted to an index

我在函数的开头添加了print(i)print(j),我发现传递的不是实数坐标,而是奇怪的:

[[ 0.  0.  0.  0.]
 [ 1.  1.  1.  1.]
 [ 2.  2.  2.  2.]
 [ 3.  3.  3.  3.]]
[[ 0.  1.  2.  3.]
 [ 0.  1.  2.  3.]
 [ 0.  1.  2.  3.]
 [ 0.  1.  2.  3.]]

为什么?numpy站点上的examples清楚地表明,只传递了两个整数,其他什么都没有传递。在

我试图使用lambda函数精确地再现他们的示例,但我得到了完全相同的错误:

distance_matrix = np.fromfunction(lambda i, j: 1 - jaro_distance(feature_dict[i], feature_dict[j]), shape=(len(feature_dict),len(feature_dict)))

任何帮助都是感激的-我想我误解了它。在


Tags: 函数numpy距离错误矩阵dictfeaturedistance
1条回答
网友
1楼 · 发布于 2024-05-16 08:35:11

根据@xnx的建议,我研究了question,发现fromfunc并不是一个一个地传递坐标,而是同时传递所有的索引。这意味着如果数组的形状是(2,2),numpy将不会执行f(0,0), f(0,1), f(1,0), f(1,1),而是将执行:

f([[0., 0.], [1., 1.]], [[0., 1.], [0., 1.]])

但看起来我的特定函数可以矢量化,并将产生所需的结果。因此,实现所需的代码如下:

^{pr2}$

而且效果很好。在

相关问题 更多 >