Python C扩展读取具有负步幅的numpy数组

时间:2015-08-19 18:11:08

标签: python c arrays numpy

我在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-&gt; dimensions [0]更改为正确的值。

一切正常但问题是当data-&gt; strides不等于+8但是-8时。 (它给出了python)。 在“我”不起作用之前改变标志。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

您假设步幅始终为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]);
}