【发布时间】:2021-01-28 21:28:28
【问题描述】:
考虑以下计算布尔向量之间相似度的简单函数。
from numba import float64, boolean, prange, guvectorize
import numpy as np
@guvectorize([(boolean[:], boolean[:], float64[:])], '(n),(n)->()')
def tanimoto(fp_1, fp_2, res):
bw_or = np.sum(np.bitwise_or(fp_1, fp_2))
if bw_or != 0.0:
res[0] = np.sum(np.bitwise_and(fp_1, fp_2)) / bw_or
else:
res[0] = 0.0
我们可以用两个布尔向量调用这个函数,也可以用一个布尔向量和一个布尔向量数组来计算几个向量的相似度(在老式的 numpy 风格中):
fp1 = np.array([True, False, False, True, False])
fp2 = np.array([False, False, False, True, False])
fp3 = np.array([True, False, True, True, False])
tanimoto(fp1, [fp2, fp3])
现在,我正在计算相似度矩阵的上三角形,该矩阵基本上是布尔向量数组的所有成对相似度。
def similarityMatrix(fp_list: np.ndarray) -> np.ndarray:
m = fp_list.shape[0]
dm = np.zeros((m * (m - 1)) // 2)
idx = [int((2*i*m-i*i-i)/2) for i in range(0, m)]
for i in prange(0, m - 1):
dm[idx[i]:idx[i+1]] = tanimoto(fp_list[i], fp_list[i+1:])
return dm
similarityMatrix(np.array([fp1,fp2,fp3]))
但是,我似乎无法正确地 @jit-compile 和并行化 similarityMatrix 函数。当我添加 @jit(parallel=True) 注释时,我收到以下几条消息:
编译正在回退到启用循环提升的对象模式,因为函数“similarityMatrix”由于以下原因导致类型推断失败:无类型全局名称“tanimoto”:无法确定
的 Numba 类型>
问题:有没有办法让内部 prange-loop 并行运行?还有其他我不知道的事情可以让这尽可能快吗?
旁注:我知道 scipy 的 pdist 函数。这里的目标是更好地了解 Numba 并深入了解我目前缺少的内容。
【问题讨论】: