将一个Numpy结构化数组转换为一个结构数组

2024-06-17 13:21:20 发布

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

我试图从应用程序的C部分传递和访问用Python创建的Numpy结构化数组。我想使用这样的数组是从Python端创建数组,按我的意愿使用它(仍然是Python),然后在计算量大的阶段将数组传递给C模块(没有副本,使用指针),这样就可以在C端访问和修改数据。在

在Python方面,我创建了一个Numpy结构的数组,其中包含一个自定义的dtype,如下面所示,并将其传递给位于简单C扩展中的函数:

Python

import numpy
import cmodule

blocksize=10
numblocks=5

particle_struct_dtype = numpy.dtype([
    ('position_x', 'f4', (blocksize,)),
    ('position_y', 'f4', (blocksize,)),
    ('position_z', 'f4', (blocksize,))
])

particles = numpy.empty(numblocks, dtype=particle_struct_dtype)

cmodule.compute(particles, blocksize, numblocks) 

如图所示,我正在创建一个键值数组,其中每个key代表C结构的“field”,而这个字段的每个值都是一个float数组。 然后,在C端,我试图通过:
-首先使用PyArg_ParseTuple函数检索对数组的引用
-然后使用Py_BuildValue创建的一个伪PyObject来获得数组的数据类型(结构的类型)的表示,然后用PyArray_AsCArray对其进行强制转换

C

^{pr2}$

尽管如此,在访问数据时,我仍然会收到SEGFAULT错误。深入研究这些错误后,我发现数据并不像我想象的那样(转换没有正确完成)。
我试图通过传递一个简单元组数组而不是一个包含更多数组的元组数组来简化示例:

dummy = Py_BuildValue("[(s, s), (s, s), (s, s)]", "position_x", "f4", "position_y", "f4", "position_z", "f4");
PyArray_DescrConverter(dummy, &arrayDescr);

struct simple_particles_t *castedParticles;
npy_intp dims[1];
dims[0] = blocksize;
PyArray_AsCArray((PyObject **)&particles, (struct simple_particles_t**)&castedParticles, dims, 1, arrayDescr);

这似乎是可行的,我得到了简化结构的数组,每个结构只包含3个浮点(每个字段一个),而不是3个浮点数组。在

我的怀疑是:
-我错过什么了吗?是否可以将每个字段都有一个float数组的结构化numpy数组转换为一个C结构数组,这样每个Python字段都映射到C结构的字段?例如,从C访问particles[0].position_x[0]就像从Python端访问{}。
-这会复制吗?我试图从C访问和修改Python分配的内存


Tags: 数据numpyposition数组结构struct结构化dtype