開始構建一個文本相似性專案,我在其中獲取名稱串列(100,000 多條記錄)并在較大的文本(檔案)中找到最佳匹配項。已經使用快速模糊和模糊集庫成功地做到了這一點,想看看我的特定用例是否有更快的方法。嘗試使用三元組并散列三元組字串。想要盡可能避免回圈以提高性能(Pythonic)。下面是一個片段示例,其中 A 可能是檔案的三元組表示,而 b 可能是一個名稱的表示。
import numpy as np
a = np.array([(1,2,3), (1,3,3), (3,3,3), (3,3,4)])
b = np.array((1,2,3))
print(np.sum(a == b))
輸出是 6 但希望它是 [3,2,1,0] 或者只是最大結果 3。
編輯:
在更詳細地查看問題時,元組的靜態長度不適用于不同長度的名稱。EG MATTHEW 表示為 (MAT,ATT,TTH,THE,HEW) 而 CALEB 表示為 (CAL,ALE,LEB)。
目前的想法是最好將檔案分解為帶有滑動視窗的三元組。要么是串列中所有名稱的最大長度,要么是當前正在搜索的名稱的大小。歡迎任何想法
uj5u.com熱心網友回復:
你可以使用axis引數
>>> np.sum(a==b, axis=1)
array([3, 2, 1, 0])
這將跨行求和并回傳一維陣列。然后要獲得最大值,以下任一方法都將起作用。
>>> np.max(np.sum(a==b, axis=1))
3
>>> np.sum(a==b, axis=1).max()
3
uj5u.com熱心網友回復:
由于您想計算非零值,一種替代方法是使用np.count_nonzero:
import numpy as np
a = np.array([(1, 2, 3), (1, 3, 3), (3, 3, 3), (3, 3, 4)])
b = np.array((1, 2, 3))
res = np.count_nonzero(a == b, axis=1)
print(res)
輸出
[3 2 1 0]
之后,您可以通過使用找到最大值.max:
res.max() # 3
對于不那么小的陣列,似乎兩種方法在速度方面都具有可比性,請參見下面的(不是很徹底的)比較:
import numpy as np
a = np.array([(1, 2, 3), (1, 3, 3), (3, 3, 3), (3, 3, 4)] * 1000)
b = np.array((1, 2, 3))
%timeit np.count_nonzero(a == b, axis=1)
110 μs ± 744 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit np.sum(a == b, axis=1)
108 μs ± 379 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/341077.html
