2016-12-14 35 views
1

我正面临一个奇怪的问题。下面的代码(一个功能的一部分)索引时Numba类型发生变化

@njit 
def treedist(treedists, An, Bn, w, M, Theta): 
    print(An) 
    print(Bn) 
    print(An[1]) 
    print(Bn[1]) 

打印以下:

[(0.0, 1), (1.0, 18.071077087009371), (0.0, 0)] 
[(0.0, 1), (1.0, 25.897262991223062), (0.0, 0)] 
(1.0, 18) 
(1.0, 25) 

出于某种原因,在所述元组的第二个元素的float64被转换为Int64。谁能告诉我为什么会发生这种情况?

谢谢!

+1

如果你想输入一个元组列表给这个函数,'njit'好像是错误的装饰器使用。 – user2357112

回答

1

问题是以下我相信 - Numba只能处理常量类型列表,因此它会查看您的列表并检查第一个元素,并看到它的类型为(float64, int64)。你可以看到这一点,如果你看一下:在运行功能后

treedist.inspect_types() 

treedist.inspect_llvm() 

。然后它对这种类型的前景进行了假设。如果你改变所有的元组具有一致的类型:

An = [(0.0, 1.0), (1.0, 18.071077087009371), (0.0, 0.0)] 

你不会得到剧组当您打印An[1]为int。

如果你有一个不一致类型的项目列表,numba会失败(不幸的是,在这里,它是在默默地进行)。看到说,名单必须严格均匀文档:

http://numba.pydata.org/numba-doc/0.29.0/reference/pysupported.html#list

,它是不是“拒绝”你的元组可能是因为它没有正确地处理那些不遵守复杂的对象,这一事实正确的约定。

+0

在此处发布的问题numba问题跟踪器:https://github.com/numba/numba/issues/2220 – JoshAdel

+0

感谢您的帮助!这确实是问题(和解决方案) – user2817219

相关问题