gpt4 book ai didi

numpy - 将结构化数组传递给 Cython,失败(我认为这是一个 Cython 错误)

转载 作者:行者123 更新时间:2023-12-04 06:55:44 30 4
gpt4 key购买 nike

假设我有

a = np.zeros(2, dtype=[('a', np.int),  ('b', np.float, 2)])
a[0] = (2,[3,4])
a[1] = (6,[7,8])

然后我定义相同的Cython结构

import numpy as np
cimport numpy as np

cdef packed struct mystruct:
np.int_t a
np.float_t b[2]

def test_mystruct(mystruct[:] x):
cdef:
int k
mystruct y

for k in range(2):
y = x[k]
print y.a
print y.b[0]
print y.b[1]

在这之后,我跑

test_mystruct(a)

我得到了错误:

ValueError                                Traceback (most recent call last)
<ipython-input-231-df126299aef1> in <module>()
----> 1 test_mystruct(a)
_cython_magic_5119cecbaf7ff37e311b745d2b39dc32.pyx in _cython_magic_5119cecbaf7ff37e311b745d2b39dc32.test_mystruct (/auto/users/pwang/.cache/ipython/cython/_cython_magic_5119cecbaf7ff37e311b745d2b39dc32.c:1364)()
ValueError: Expected 1 dimension(s), got 1

我的问题是如何解决?谢谢。

最佳答案

这个pyx编译和导入ok:

import numpy as np
cimport numpy as np

cdef packed struct mystruct:
int a[2] # change from plain int
float b[2]
int c

def test_mystruct(mystruct[:] x):
cdef:
int k
mystruct y

for k in range(2):
y = x[k]
print y.a
print y.b[0]
print y.b[1]

dt='2i,2f,i'
b=np.zeros((3,),dtype=dt)
test_mystruct(b)

我从我的评论中提到的测试示例开始,并尝试了您的案例。我认为关键的变化是将打包结构的第一个元素定义为 int a[2]。因此,如果任何元素是数组,则第一个元素必须是数组才能正确设置结构。

显然是测试文件没有捕捉到的错误。

将元素定义为 int a[1] 不起作用,可能是因为 dtype 删除了这样一个维度:

In [47]: np.dtype([('a', np.int, 1),  ('b', np.float, 2)])
Out[47]: dtype([('a', '<i4'), ('b', '<f8', (2,))])

定义 dtype 来解决这个问题应该不难,直到问题被提出和修补。


struct 可以有 a[1],但是数组 dtype 必须用元组指定大小: ('a','i',(1,))('a','i',1) 将使尺寸 ()

如果其中一个结构数组是二维的,看起来它们都必须是:

cdef packed struct mystruct:
int a[1][1]
float b[2][1]
int c[2][2]

https://github.com/cython/cython/blob/c4c2e3d8bd760386b26dbd6cffbd4e30ba0a7d13/tests/memoryview/numpy_memoryview.pyx


退后一步,我想知道在 cython 中处理复杂的结构化数组有什么意义。对于某些操作,将字段作为单独的变量传递不是同样有效。例如 myfunc(a['a'],a['b']) 而不是 myfunc(a)

关于numpy - 将结构化数组传递给 Cython,失败(我认为这是一个 Cython 错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30035287/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com