Numba vectorize生成ufunc调用accumulate出现ValueError如何解决
问题原因
该报错的核心原因是Numba通过@nb.vectorize生成的ufunc默认针对原生数值类型编译实现,本身不支持object类型运算。你之前使用np.frompyfunc生成的ufunc是基于Python对象封装实现的,所以可以指定dtype=object正常运行,二者的底层实现逻辑存在差异。
可行解决办法
- 方法1:移除
dtype=object参数,直接使用和输入数组匹配的数值类型
你示例中的输入为整数数组,不需要依赖object类型中转,直接修改调用参数即可正常运行,修改后完整代码如下:
import numpy as np import numba as nb arr = np.arange(15).reshape((3,5)) @nb.vectorize def myadd(x, y): return x+y # 无需指定dtype=object,Numba会自动匹配输入的整数类型,也可显式指定dtype=np.int64确保兼容性 print(myadd.accumulate(arr, axis=1).astype(int))
- 方法2:提前为vectorize装饰器声明支持的类型签名
如果你的自定义函数需要处理多种数值类型,可以在装饰器中显式声明支持的输入输出类型,进一步提升类型匹配的稳定性:
import numpy as np import numba as nb arr = np.arange(15).reshape((3,5)) # 显式声明支持int64、float64两种输入输出组合,可根据实际需求扩展 @nb.vectorize([ nb.int64(nb.int64, nb.int64), nb.float64(nb.float64, nb.float64) ]) def myadd(x, y): return x+y print(myadd.accumulate(arr, axis=1).astype(int))
以上两种方法均可在你提供的环境版本(Python3.8.10+Numba0.54.0+Numpy1.20.3)下正常运行。
内容的提问来源于stack exchange,提问作者NNN
相关产品推荐
相关产品推荐

