You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 19:24:04