Cython内存视图 - 从结构数组开始?

8

我希望尽可能少地复制,快速填充一个我正在从C逐步接收的长结构体数组。

如果我的结构体只包含基本数据类型,例如以下内容:

cdef packed struct oh_hi:
    int lucky
    char unlucky

然后以下内容能正常工作:

  DEF MAXPOWER = 1000000
  cdef oh_hi * hi2u = <oh_hi *>malloc(sizeof(oh_hi)*MAXPOWER)
  cdef oh_hi [:] hi2me = <oh_hi[:MAXPOWER]> hi2u

但是一旦我将我的结构体改为保存字符数组:
cdef packed struct oh_hi:
    int lucky
    char unlucky[10]

之前的memoryview转换代码编译通过,但在运行时出现了错误:
  ValueError: Expected 1 dimension(s), got 1

有没有在Cython中简单的方法来完成这个任务?我知道我可以创建一个结构化数组,但是据我所知,那样做不能让我直接将C结构体赋值给它。

这似乎与numpy结构化数组的此问题非常相似。问题在于,如果结构体中的第一项是标量,则cython似乎不喜欢混合数组和标量值。解决方法就是重新排列结构体中的项目,使得始终有一个数组成员/项目在第一位。 - CodeSurgeon
1个回答

5

实际上,只需构建一个结构化的numpy数组,然后使用memoryview即可。

cdef np.ndarray hi2u = np.ndarray((MAXPOWER,),dtype=[('lucky','i4'),('unlucky','a10')])
cdef oh_hi [:] hi2me = hi2u

这个的性能似乎很不错,如果你需要在Python中恢复数据,这可以节省一些时间。通常情况下,使用NumPy版本也是相当不错的。=p


1
这对我没有起作用。可能是因为我使用了固定的int32数组而不是字符串'a10'。最终我将结构扁平化了。 - dashesy
我会调查一下,但你希望这些数据以什么方式存储在numpy结构中? - radikalus
对于10个整数,类似于('lucky',(np.int32,10))。 - dashesy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接