数组作为数字中的函数参数

Arrays as function parameters in numba

以下简单示例因错误而失败:

独立模块:

from numba.pycc import CC

cc = CC('foo')

@cc.export('product','float64(float64[:], float64[:])')
def product(a, b):
    prod = 0
    for i in range(a.size):
        prod += a[i] * b[i]
    return prod

if __name__ == "__main__":
    cc.compile()

测试程序:

import numpy as np
import foo

x = np.array([2,3,1,0])
y = np.array([2,3,1,0])

print(foo.product(x,y))

失败并显示错误消息:

Traceback (most recent call last):
  File "\temp\test.py", line 7, in <module>
    print(foo.product(x,y))
SystemError: exception RuntimeError<class 'BytesWarning'> not a BaseException subclass

在 Windows 上使用的 numba 版本是 0.42.0 和 Python 3.7.2。 有什么提示吗?

所以,我终于让你的代码工作了:

from numba.pycc import CC

cc = CC('foo')
cc.verbose = True
@cc.export('producti','int64(int64[:], int64[:])')  #<--- Your data type was wrong
def product(a, b):
    prod = 0
    for i in range(a.size):
        y = a[i] * b[i]
        prod += y
    return prod

if __name__ == "__main__":
    cc.compile()

测试上述功能的代码:

import numpy as np
import foo

x = np.array([2, 3, 1, 0])
y = np.array([2, 3, 1, 0])

print(foo.producti(x, y))   # Output : 14

这里需要注意的几点:

  • 您创建 xy 数组的方式,dtype 默认设置为 int64,因此当您将其类型转换为 float64 时转换不正确。

print(x.dtype)

Output : dtype('int64')

  • 因此,只需将您的类型固定为 int64 即可解决问题(或者您可以根据需要将 i8 用作 shorthand)。

  • Link 到 google Colab notebook with 运行 code : Notebook Link

参考资料: