gpt4 book ai didi

Python C API : transfer dynamically allocated array to Python

转载 作者:行者123 更新时间:2023-11-30 16:55:56 25 4
gpt4 key购买 nike

我正在使用Python,我想对巨大的数组(大小可达8000 x 500)。为了加快速度,我用 C 实现了该例程。我使用 Python C API 将数据传递给 C,进行计算,然后将其发送回来。由于涉及到如此庞大的数组,所以我使用动态内存分配来存储计算结果(标记为R,参见代码)。

现在我在将此数组发送回 Python 时遇到问题。目前我正在使用 Py_BuildValue (参见代码)。构建 .pyd 扩展可以工作,但是当我执行 Python 代码时,我收到消息“python.exe 停止工作”。

我想问一下,您是否可以帮助我以正确的方式实现它:)[我在代码中省略了一些变量,以使其更短]

# include <stdlib.h>
# include <stdio.h>
# include <math.h>
# include <Python.h>
# include <numpy\arrayobject.h>

static PyObject* integrateODE(PyObject* self, PyObject* args);
double func ( double t, double u , double a );

int Nt, Nr, m;
double dt, rho0, eta1, eta2, rho2decay;

static PyObject* integrateODE(PyObject* self, PyObject* args)
{
int i,k, len;
double *mag;
double u, u0, u1,u2,u3 ;
double a0, a1;
double f0, f1, f2, f3;
PyObject *U;
double *R;

PyArg_ParseTuple(args, "Offifffii", &U, &dt, &rho0, &m, &eta1, &eta2,&rho2decay, &Nt, &Nr);
R = malloc(sizeof(double) * Nt*Nr);
len = PySequence_Length(U);
mag= malloc(sizeof(double) * Nt*Nr);

while (len--) {
*(mag + len) = (double) PyFloat_AsDouble(PySequence_GetItem(U, len));
}

for (k=0; k<Nr; k++ )
{
u0 = rho0;
for (i=0; i<Nt; i++ )
{
a0=mag[k*Nt + i];
a1=mag[k*Nt + i+1];
f0 = func( t0, u0, a0 );
u1 = u0 + dt * f0 / 2.0;
f1 = func( t1, u1, a1 );
u2 = u0 + dt * f1 / 2.0;
f2 = func( t2, u2, a1 );
u3 = u0 + dt * f2;
f3 = func( t3, u3, a0 );
u = u0 + dt * ( f0 + 2.0 * f1 + 2.0 * f2 + f3 ) / 6.0;
R[k*Nt + i] = u;
u0 = u;
}
}

return Py_BuildValue("O", R);
}

double func ( double t, double u, double a ){
dydt = -u*u + a * u + a;
return dydt;
}
static PyMethodDef ODE_Methods[] =
{
{"integrateODE", integrateODE, METH_VARARGS, NULL},
{NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC initodeNRP(void) {
(void) Py_InitModule("odeNRP", ODE_Methods);
}

非常感谢您给我的任何帮助:)

最佳答案

在您的分配中:

mag size = Nt*Nr,

在循环中,当 i 为 max 并且 k 为 max 时:

k=Nr-1, i=Nt-1, 

因此:

a0=mag[k*Nt + i]; -> (Nt-1)+Nt*(Nr-1)=Nt-1+NtNr-Nt=NtNr- 1,然后你调用

a1=mag[k*Nt + i+1];, (Nt-1)+Nt*(Nr-1)+1=Nt-1+NtNr-Nt +1=NtNr 这是NtNr -> 出界

您也可以尝试使用 PyList_New(length);PyArray_SimpleNewFromData(nd, dims, NPY_DOUBLE, a); 返回您的数组。

关于Python C API : transfer dynamically allocated array to Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40124249/

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