str对象和字符串dtypes在Cython中不匹配

时间:2014-06-03 22:25:42

标签: python arrays string numpy cython

我尝试使用 ipython 笔记本运行简单的Cython代码。我有以下代码段:

%load_ext cythonmagic
%%cython
cimport cython
import numpy as np
cimport numpy as np

cdef int test(np.ndarray[np.str, ndim = 1] a):
    return 6

print test(np.array(['gona','haraka']))

我想要的是将一个numpy 1D字符串数组传递给函数。执行函数test时,它返回0并得到以下错误:

  

Exception ValueError:"缓冲区dtype不匹配,预期&#str; str对象'   但有一个字符串"在   ' _cython_magic_505ff8c1b7497cde585006f723e794bd.test'忽略

这可能是什么原因?
如何传递numpy字符串数组?
即使我在调用函数str时使用np.str代替dtype=np.str或在numpy数组中给test,我也会遇到同样的错误。

1 个答案:

答案 0 :(得分:1)

我使用Cython 0.20.1进行了测试,您可以使用常规np.ndarray定义,而不是指定数据类型或维数:

cimport cython
import numpy as np
cimport numpy as np

cdef int test(np.ndarray a):
    return 6

print test(np.array(['gona', 'haraka']))

如果想要更好的性能,可以仅使用其指针传递NumPy字符串数组,并通过char *缓冲区传递数组。以下示例显示了如何实现此目的。它增加了字符代码,为每个非零值添加1:

import numpy as np
cimport numpy as np

cdef int f(char *a, int size):
    cdef int i
    for i in range(size):
        if a[i]!=0:
            a[i] += 1

def main():
    cdef char *inp
    cdef np.ndarray a
    a = np.array(['aaaa', 'bbbbbb'])
    inp = a.data
    print a
    f(inp, a.itemsize*a.shape[0])
    print a

当你运行main()时,你得到:

['aaaa' 'bbbbbb']
['bbbb' 'cccccc']