【问题标题】:Numba type changes when indexing索引时 Numba 类型更改
【发布时间】:2016-12-15 01:43:11
【问题描述】:

我遇到了一个奇怪的问题。以下代码(函数的一部分)

@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。谁能告诉我为什么会这样?

谢谢!

【问题讨论】:

  • 如果你想向这个函数输入一个元组列表,njit 似乎是错误的装饰器。

标签: python numba


【解决方案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

它没有“拒绝”你的元组的事实可能是因为它没有正确处理不遵循正确约定的复杂对象。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 2016-05-11
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多