[Numpy-discussion] Returning a 2-D PyArrayObject
Amitha P
amitha_linux at yahoo.com
Thu Mar 28 06:59:10 CST 2002
Hi all,
I am new to Python/Python extension programming. I am
writing a c-extension to python which takes a
3-Dimensional array object and returns the
2Dimensional array object.
The c function returns the 2-D array and converts into
Python object, but the 2D python array object doesnot
contain the correct values, it's priting out some
irrevelent values. I could successfully return single
dimension Python array object but I am not able to
return 2D python array object. I am attaching the
code. Please look at it and point out the errors.
Thank you very much..
-------------------------------------------------------
CMATRIXMUL16.c - This takes the array (the python 3D
array) and returns the 2D array
------------------------------------------------------
#include <stdio.h>
#include <math.h>
float* cmatrixmul16(float *array,float *paddarr, int
n,int r,int col,float
**store)
{
int i,j,k;
int devices;
int pathpoints;
int column;
int len;
float sum;
float **a,**b,**c,**d;
float *temp;
static float **tracematrix;
tracematrix = store;
pathpoints=r;
column = col;
devices= n;
len = pathpoints*2;
temp = (float *)malloc( len* sizeof(float));
sum =0.0;
a = (float **)malloc(devices * sizeof(float));
b = (float **)malloc(devices * sizeof(float));
c = (float **)malloc(devices * sizeof(float));
d = (float **)malloc(devices * sizeof(float));
for(i=0;i<devices;i++)
{
a[i] = (float *)malloc(pathpoints*sizeof(float));
b[i] = (float *)malloc(pathpoints*sizeof(float));
c[i] = (float *)malloc(pathpoints*sizeof(float));
d[i] = (float *)malloc(pathpoints*sizeof(float));
}
for(k=0;k<devices;k++){
for(i=0;i<pathpoints;i++)
{
a[k][i] =
(*(array+k*pathpoints*column+i*column+0))*(1.0/sqrt(2.0));
b[k][i] =
(*(array+k*pathpoints*column+i*column+1))*(1.0/sqrt(2.0));
c[k][i] =
(*(array+k*pathpoints*column+i*column+2))*(1.0/sqrt(2.0));
d[k][i] =
(*(array+k*pathpoints*column+i*column+3))*(1.0/sqrt(2.0));
tracematrix[k][i] =
a[k][i]*a[k][i]+b[k][i]*b[k][i];
tracematrix[k][pathpoints+i] =
c[k][i]*c[k][i]+d[k][i]*d[k][i];
}
fprintf(stderr,"tracematrix: %f\n",
tracematrix[k][0]);
}
for(i=0;i<devices;i++)
{
free(a[i]);
free(b[i]);
free(c[i]);
free(d[i]);
}
free(a);
free(b);
free(c);
free(d);
return (float *)tracematrix;
}
------------------------------------------------------
This is the module which calls the function
_tests16module.c
-------------------------------------------------------
#include <Python.h>
#include <arrayobject.h>
#include <math.h>
static PyObject * Py_arraytest1 (PyObject *, PyObject
*);
static char _tests17_module_doc[] ="tests11: module
documentation";
static char arraytest1__doc__[]= "mytest:function
documentation";
/********************************Python symbol table
*****************************************/
static PyMethodDef _tests17_methods[] = {
{"arraytest1" , (PyCFunction)Py_arraytest1 ,
METH_VARARGS,arraytest1__doc__
},
{NULL, (PyCFunction)NULL,0,NULL } /* terminates the
list of methods */
};
/*********************************End of Symbol table
***************************************/
void init_tests17()
{
/* We will be using C-functions defined in the array
module. So we
* need to be sure that the shared library defining
these functions
* is loaded. */
import_array();
(void) Py_InitModule4(
"_tests17", /* module
name */
_tests17_methods, /*
structure containing python
symbol info */
_tests17_module_doc, /*
module documentation string */
(PyObject *) NULL,
PYTHON_API_VERSION);
}
/*function to calculate the product of two arrays */
static PyObject *
Py_arraytest1(PyObject *self, PyObject *args)
{
PyArrayObject *array, *paddarr, *product;
char *c;
int n,r,col,i,j,k;
int dimensions[2];
float **store;
if (!PyArg_ParseTuple(args, "O!O!",
&PyArray_Type,
&array,&PyArray_Type,&paddarr))
return NULL;
/* The arguments are the 3-D array and the 1-Dpaddarr
*/
n = (long) array->dimensions[0];
r = (long) array->dimensions[1];
col = (long) array->dimensions[2];
store = (float **)malloc(n*sizeof(float));
for(i=0;i<n;i++)
store[i]=(float *)malloc(2*r*sizeof(float));
c= (char*)cmatrixmul16((float *)array->data,(float
*)paddarr->data,n,r,col,store);
dimensions[0] = n;
dimensions[1] = 2*r;
product = (PyArrayObject *)PyArray_FromDimsAndData(2,
dimensions,
PyArray_FLOAT,c);
PyArray_Return(product);
}
__________________________________________________
Do You Yahoo!?
Yahoo! Movies - coverage of the 74th Academy Awards®
http://movies.yahoo.com/
More information about the Numpy-discussion
mailing list