当我在Cython中将一个numpy ndarray从一种类型转换为另一种类型时,我遇到了一个非常奇怪的错误。例如,当我写下以下convert_test.pyx时:
cimport cython
import numpy as np
cimport numpy as np
DTYPE = np.float32
ctypedef np.float32_t DTYPE_t
def convert_to_int(np.ndarray[DTYPE_t, ndim=2] float_matrix):
cdef np.ndarray[np.int, ndim=2] int_matrix=float_matrix.astype(np.int)
return int_matrix
编译并测试:
from convert_test import convert_to_int
a_int=convert_to_int(np.zeros((2,2)).astype(np.float32))
我收到了非常熟悉的消息:
ValueError:缓冲区dtype不匹配,预期'int object'但得到'long'
这可能非常明显,但我还没有看到它。
答案 0 :(得分:0)
您必须在声明中使用_t类型:cdef np.ndarray [np.int_t,ndim = 2]。
答案 1 :(得分:0)
你为什么不这样做?编译并在我的计算机上正常工作:
cimport cython
import numpy as np
cimport numpy as np
DTYPE = np.float32
ctypedef np.float32_t DTYPE_t
def convert_to_int(np.ndarray[DTYPE_t, ndim=2] float_matrix):
int_matrix = np.array(float_matrix, dtype=np.int32)
return int_matrix
或者如果你真的想要一个记忆视图:
def convert_to_int(DTYPE_t[:,:] float_matrix):
cdef int[:,:] int_matrix = np.array(float_matrix, dtype=np.int32)
return np.asarray(int_matrix)
第二个答案我刚将旧的ndarray
参数转换为typed memoryviews
和int_matrix
的现代float_matrix
语法。上面的样式是矩阵的连续内存格式[:,:]
(例如NumPy默认使用numpy.zeros)。
请注意,您发布的功能只是截断小数点后的所有内容(没有向上/向下舍入),所以请确保这是您想要的。