Cython无法将float ndarray转换为int ndarray

时间:2017-07-06 13:56:43

标签: python numpy cython

当我在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'

这可能非常明显,但我还没有看到它。

2 个答案:

答案 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 memoryviewsint_matrix的现代float_matrix语法。上面的样式是矩阵的连续内存格式[:,:](例如NumPy默认使用numpy.zeros)。

请注意,您发布的功能只是截断小数点后的所有内容(没有向上/向下舍入),所以请确保这是您想要的。