gpt4 book ai didi

Python C 扩展以负步长读取 numpy 数组

转载 作者:太空宇宙 更新时间:2023-11-04 04:34:44 24 4
gpt4 key购买 nike

我在 Python 中有一个函数,它正在读取一些文件并创建非常长的 numpy 数组。

def readmat(name):
outp=loadmat(name);
outp= outp['screen1'];
outp=outp['data'];
outp=outp[0,0];
outp=outp[0];
return outp;

signal=readmat('nameoffile.mat');

现在我创建了另一个函数,它调用另一个像 Pyextension 一样编写的函数。

python :

def getfrom(vector,positions):
outp=np.arange(0,dtype=float); #create needed data type
clib.getfrom(vector,positions,outp);
return outp;

这个函数应该执行这样的事情

a=[10,11,12,13,14,15,16,17,18,19];

b=[0,1,10];

c=getfrom(a,b);

然后是 c=[10,11,19]

C:

static PyObject *py_getfrom(PyObject* self, PyObject* args)
{
PyArrayObject *vector, *positions, *output;
int pos_index, i, *length;

double pos_in_vector;
if (!PyArg_ParseTuple(args, "OOO",&vector,&positions,&output))
return NULL;

length=&positions->dimensions[0];
double *work;
work=(double*)calloc(*length, sizeof(double))

for (i=0; i<*length; i++)
{
pos_in_vector=*((positions->data)+i);
pos_index=pos_in_vector;
work[i]=*((double *)(vector->data)+pos_index);
}
output->dimensions[0]=*length;
output->data=work;
return Py_None;
}

C 函数应创建所需的数组“work”并将其赋予变量“outp”的结构,并将 outp->dimensions[0] 更改为正确的值。

一切正常,但问题是当 data->strides 不等于 +8 而是 -8 时。 (它给 python )。在“我”不起作用之前更改符号。

任何人都可以帮助我吗?

最佳答案

您假设步幅始终为 8,但您的指针算法是错误的。只需使用给定的步幅,一切都会正常进行。

类似的东西(未经测试):

for (i=0; i<*length; i++)
{
pos_in_vector = *(double*)(positions->data + i * positions->strides[0]);
work[i] = *(double*)(vector->data + (int)pos_in_vector * vector->strides[0]);
}

关于Python C 扩展以负步长读取 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32102690/

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