将带字符串的结构化numpy数组传递给cython函数

2024-04-29 10:46:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在cython中创建一个函数,通过定义cython结构类型来接受numpy结构化数组或记录数组。假设我有数据:

a = np.recarray(3, dtype=[('a', np.float32),  ('b', np.int32), ('c', '|S5'), ('d', '|S3')])
a[0] = (1.1, 1, 'this\0', 'to\0')
a[1] = (2.1, 2, 'that\0', 'ta\0')
a[2] = (3.1, 3, 'dogs\0', 'ot\0')

(注意:无论是否有空终止符,下面描述的问题都会出现)

然后我得到了赛顿密码:

^{pr2}$

当我试图运行test_struct(a)时,我得到了一个错误:

ValueError: Expected a dimension of size 5, got 8

如果在数组和相应的结构中重新排序,使包含字符串的字段彼此不相邻,则函数按预期工作。似乎Cython函数没有正确地检测到c和{}字段之间的边界,并且认为好像传入了长度总和的char数组。在

除了重新整理数据(这是可能的,但并不理想),是否还有其他方法将固定长度字符串数据的重排传递到Cython中?在

更新:这似乎是一个潜在的Cython错误。请参见以下关于Cython-google小组的讨论,该讨论提示了问题的发生地:

https://groups.google.com/forum/#!topic/cython-users/TbLbXdi0_h4

更新2:此错误已于2014年2月23日在Github上的master cython分支中修复,该修补程序计划包含在v0.20.2:https://github.com/cython/cython/commit/58d9361e0a6d4cb3d4e87775f78e0550c2fea836


Tags: 数据函数字符串httpsnumpycom类型定义