我正在进行一些文本分析,作为其中的一部分,我需要在特定列表中的所有单词之间获得一个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
构建它。根据文档和示例,它将坐标传递给函数,获取结果,构造结果矩阵。
我尝试了以下方法:
from jellyfish import jaro_distance
def distance(i, j):
return 1 - jaro_distance(feature_dict[i], feature_dict[j])
feature_dict = 'CHEESE CHORES GEESE GLOVES'.split()
distance_matrix = np.fromfunction(distance, shape=(len(feature_dict),len(feature_dict)))
注意: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)))
感谢任何帮助 - 我认为我以某种方式误解了它。
答案 0 :(得分:0)
正如@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.]])
但看起来我的特定功能可以进行矢量化并产生所需的结果。所以实现所需的代码如下:
from jellyfish import jaro_distance
import numpy
def distance(i, j):
return 1 - jaro_distance(feature_dict[i], feature_dict[j])
feature_dict = 'CHEESE CHORES GEESE GLOVES'.split()
funcProxy = np.vectorize(distance)
distance_matrix = np.fromfunction(funcProxy, shape=(len(feature_dict),len(feature_dict)))
它运作正常。