【问题标题】:Cython Memoryviews -- From Array of Structs?Cython Memoryviews——来自结构数组?
【发布时间】:2013-06-21 15:33:33
【问题描述】:

我想用尽可能少的副本快速填充我从 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 中是否有一种简单的方法可以做到这一点?我知道我可以创建一个结构化数组,但是 afaik,这不会让我将 C 结构直接分配给它。

【问题讨论】:

  • 这似乎与带有 numpy 结构化数组的 this issue 非常相似。问题是如果结构中的第一项是标量,cython 似乎不喜欢将数组与标量值混合。解决方法是重新排列结构中的项目,以便始终首先有一个数组成员/项目。

标签: python c cython


【解决方案1】:

实际上,只需构建一个结构化的 numpy 数组,然后再创建一个 memoryview 就可以了。

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

这个性能看起来相当不错,如果您需要在 python 中返回数据,这可以保存以后的副本。像往常一样,numpy 版本非常好。 =p

【讨论】:

  • 这对我不起作用。也许是因为我使用了int32 的固定数组而不是字符串'a10'。我最终把结构弄平了。
  • 我会调查一下,但是您希望这些如何存储在 numpy 结构中?
  • 对于 10 个整数,行 ('lucky',(np.int32,10))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
相关资源
最近更新 更多