我在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)。 在“我”不起作用之前改变标志。
任何人都可以帮助我吗?
答案 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]);
}