2 回答

TA貢獻1752條經(jīng)驗 獲得超4個贊
讓我們嘗試稍微修改一下函數(shù),以便消除重復(fù)條目的計算:
from itertools import combinations, product
def ld(a):
u = set(a)
return {b:Levenshtein.classic(*b) for b in product(u,u)}
dist = ld(mylist)
(pd.Series(list(dist.values()), pd.MultiIndex.from_tuples(dist.keys()))
.unstack()
.reindex(mylist)
.reindex(mylist,axis=1)
)
輸出:
foo bar baz foo foo
foo 0 3 3 0 0
bar 3 0 1 3 3
baz 3 1 0 3 3
foo 0 3 3 0 0
foo 0 3 3 0 0

TA貢獻1803條經(jīng)驗 獲得超6個贊
為了計算 Levenshtein 距離,我使用了Levenshtein模塊(需要pip install python-Levenshtein ),與fuzzywuzzy配對使用 。
import Levenshtein as lv
然后,當我們使用Numpy函數(shù)時,mylist必須轉(zhuǎn)換為Numpy數(shù)組:
lst = np.array(mylist)
要計算整個結(jié)果,請運行:
result = pd.DataFrame(np.vectorize(lv.distance)(lst[:, np.newaxis], lst[np.newaxis, :]), index=lst, columns=lst)
細節(jié):
np.vectorize(lv.distance)
是lv.distance函數(shù)的矢量化版本 。(lst[:, np.newaxis], lst[np.newaxis, :])
是一個numpythonic習慣用法 - 來自lst數(shù)組的“each with every”參數(shù)列表,用于連續(xù)調(diào)用上述函數(shù)。由于Numpy向量化,整個計算運行得很快,尤其是在大數(shù)組上。
pd.DataFrame(...)
將上述結(jié)果(Numpy數(shù)組)轉(zhuǎn)換為具有正確索引和列名稱的 DataFrame。如果需要,請使用原始函數(shù)而不是lv.distance。
結(jié)果是:
foo bar baz foo foo
foo 0 3 3 0 0
bar 3 0 1 3 3
baz 3 1 0 3 3
foo 0 3 3 0 0
foo 0 3 3 0 0
添加回答
舉報