【发布时间】:2020-07-30 13:20:24
【问题描述】:
我有以下代码用于计算给定距离矩阵的路径的距离。
dist_matrix = np.array(
[
[0.0, 0.5, 1.0, 1.41421356, 1.0],
[0.5, 0.0, 0.5, 1.11803399, 1.11803399],
[1.0, 0.5, 0.0, 1.0, 1.41421356],
[1.41421356, 1.11803399, 1.0, 0.0, 1.0],
[1.0, 1.11803399, 1.41421356, 1.0, 0.0],
]
)
@jit(nopython=True)
def calc_dist(tour):
return np.sum(np.array([dist_matrix[i, j] for i, j in zip([tour[0:-1]], tour[1:])]))
tour = [0, 1, 2, 3, 4]
print(calc_dist(tour))
预期输出:2.118
但它抛出以下错误:
numba.errors.TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Invalid use of Function(<intrinsic range_iter_len>) with argument(s) of type(s): (zip(iter(list(reflected list(int64))), iter(reflected list(int64))))```
我知道我可以通过设置nopython=False 来消除错误,但我的理解是它并不值得使用 numba,除非你可以将它与nopython=True 一起使用。但是我无法弄清楚如何在我的calc_distance 函数中替换zip。用 numpy/numba 替换 zip 的最佳方法是什么?
【问题讨论】:
-
我认为这里有一个错字:
zip([tour[0:-1]], tour[1:])一个有括号,一个没有。不确定它是否相关。也可能值得一试:np.vstack((np.array(tour[0:-1]), np.array(tour[1:])))。似乎在我的系统上工作,但我不是 numba 专家。
标签: python numpy iterator numba