18

传递一个 dtype 的 numpy 数组np.float64_t可以正常工作(如下),但我不能传递字符串数组。

这是有效的:

# cython_testing.pyx
import numpy as np
cimport numpy as np

ctypedef np.float64_t dtype_t 

cdef func1 (np.ndarray[dtype_t, ndim=2] A):
    print A 

def testing():
    chunk = np.array ( [[94.,3.],[44.,4.]], dtype=np.float64)

    func1 (chunk)

但我无法完成这项工作: 我找不到 numpy 字符串 dtype 的匹配“类型标识符”。

# cython_testing.pyx
import numpy as np
cimport numpy as np

ctypedef np.string_t dtype_str_t 

cdef func1 (np.ndarray[dtype_str_t, ndim=2] A):
    print A 

def testing():
    chunk = np.array ( [['huh','yea'],['swell','ray']], dtype=np.string_)

    func1 (chunk)

编译错误是:

Error compiling Cython file:
------------------------------------------------------------
ctypedef np.string_t dtype_str_t 
    ^
------------------------------------------------------------

cython_testing.pyx:9:9: 'string_t' is not a type identifier

更新

每看一遍numpy.pxd,我看到以下ctypedef陈述。也许这足以说明我可以使用uint8_t并假装一切正常,只要我可以进行一些铸造?

ctypedef unsigned char      npy_uint8
ctypedef npy_uint8      uint8_t

只需要看看铸造将有多昂贵。

4

2 回答 2

8

使用 Cython 0.20.1 它可以使用cdef np.ndarray,而无需指定数据类型和维数:

import numpy as np
cimport numpy as np

cdef func1(np.ndarray A):
    print A

def testing():
    chunk = np.array([['huh','yea'], ['swell','ray']])
    func1(chunk)
于 2014-06-04T20:11:57.373 回答
7

看来你运气不好。

http://cython.readthedocs.org/en/latest/src/tutorial/numpy.html

尚不支持某些数据类型,例如布尔数组和字符串数组。


正如 Saullo Castro 的回答所示,这个答案不再有效,但出于历史目的,我将其保留。

于 2012-06-12T20:43:52.120 回答