14

如何int在 Cython 中制作空的 numpy 类型数组?以下适用于双数组或浮点数组:

# make array of size N of type float
cdef np.ndarray[float, ndim=1] myarr = np.empty(N)
# make array of size N of type int
cdef np.ndarray[int, ndim=1] myarr = np.empty(N)

但是,如果我尝试对 int 做同样的事情,它会失败:

# this fails
cdef np.ndarray[np.int, ndim=1] myarr = np.empty(N)
# wanted to set first element to be an int
myarr[0] = 5

它给出了错误:

ValueError:缓冲区 dtype 不匹配,预期为“int”,但得到“double”

因为显然np.empty()返回双倍。我试过了:

cdef np.ndarray[np.int, ndim=1] myarr = np.empty(N, dtype=int)

但它给出了同样的错误。如何才能做到这一点?

4

2 回答 2

12

包括声明

cimport numpy as np

并将数组声明为np.int32_t

cdef np.ndarray[np.int32_t, ndim=1] myarr = np.empty(N, dtype=np.int32)

32您可以从类型声明中删除,并使用

cdef np.ndarray[np.int_t, ndim=1] myarr = np.empty(N, dtype=np.int)

但我更喜欢明确说明 numpy 数组中元素的大小。

请注意,我还将 dtype 添加到empty; 默认 dtypeemptynp.float64.

于 2013-04-23T04:03:05.663 回答
1

奇怪!我尝试时遇到了同样的错误。但是,查看错误消息,我只是将数组创建的范围更改为一个函数,并且它可以编译!我不知道发生这种情况的原因,但是。

import numpy as np
cimport numpy as np

ctypedef np.int_t DTYPE_t
DTYPE=np.int

def new_array():
    cdef int length = 10
    cdef np.ndarray[DTYPE_t, ndim=1] x = np.zeros([length], dtype=np.int)
    return x

x = new_array()

我认为http://docs.cython.org/src/userguide/language_basics.html#python-functions-vs-c-functions有一些与 python/c/mixed 变量范围相关的信息。

于 2013-04-23T04:15:17.580 回答