Cython传递int64、float64 Numpy数组时dtype mismatch报错如何解决?
问题描述
参考多篇相关技术帖排查后,运行代码仍出现如下报错:
ValueError: Buffer dtype mismatch, expected 'int' but got 'long'
需实现可接收int64和float64类型Numpy数组的Cython函数,现有代码如下:
import cython import numpy as np cimport numpy as np cimport cython np.get_include() DTYPE = np.int64 fDTYPE = np.float64 def function(signed long long [:,:] array1, signed long long [:] array2, double[:] array3): assert array1.dtype == DTYPE assert array2.dtype == DTYPE assert array3.dtype == fDTYPE cdef signed long long x0 = array2[0] cdef signed long long y0 = array2[1] cdef double a = array3[0] cdef double b = array3[1] cdef double c = array3[2]
解决方案
报错核心原因是原生C类型signed long long、double和Numpy的int64、float64类型在不同平台的映射规则不统一,导致缓冲区类型校验不匹配,可按以下步骤修改:
- 直接使用Numpy提供的固定宽度类型别名做变量声明,替代原生C类型,Numpy已做好跨平台的类型映射适配,可保证和Numpy数组的dtype严格对应
- 可添加cython装饰器关闭不必要的运行时校验,提升执行效率
- 调用函数时传入的数组主动指定
dtype=np.int64或dtype=np.float64,避免Numpy自动推断类型导致不匹配
修改后的完整代码示例:
import cython import numpy as np cimport numpy as np cimport cython # 定义编译期和Numpy严格匹配的固定宽度类型 ctypedef np.int64_t DTYPE_t ctypedef np.float64_t fDTYPE_t DTYPE = np.int64 fDTYPE = np.float64 np.get_include() # 关闭边界校验和负索引校验,可根据实际需求调整 @cython.boundscheck(False) @cython.wraparound(False) def function(DTYPE_t [:,:] array1, DTYPE_t [:] array2, fDTYPE_t[:] array3): cdef DTYPE_t x0 = array2[0] cdef DTYPE_t y0 = array2[1] cdef fDTYPE_t a = array3[0] cdef fDTYPE_t b = array3[1] cdef fDTYPE_t c = array3[2] # 后续业务逻辑实现
内容的提问来源于stack exchange,提问作者Bun
相关产品推荐
相关产品推荐

