我尝试使用 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
,我也会遇到同样的错误。
答案 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']