[Scipy-svn] r6524 - trunk/scipy/io
scipy-svn at scipy.org
scipy-svn at scipy.org
Fri Jun 18 09:02:34 EDT 2010
Author: rgommers
Date: 2010-06-18 08:02:34 -0500 (Fri, 18 Jun 2010)
New Revision: 6524
Removed:
trunk/scipy/io/numpyiomodule.c
Modified:
trunk/scipy/io/__init__.py
trunk/scipy/io/setup.py
Log:
Remove deprecated objects in scipy.io on the C level.
Modified: trunk/scipy/io/__init__.py
===================================================================
--- trunk/scipy/io/__init__.py 2010-06-18 13:02:16 UTC (rev 6523)
+++ trunk/scipy/io/__init__.py 2010-06-18 13:02:34 UTC (rev 6524)
@@ -7,65 +7,6 @@
from numpy import deprecate
-from numpyio import packbits, unpackbits, bswap, fread, fwrite, \
- convert_objectarray
-
-fread = deprecate(fread, message="""
-scipy.io.fread can be replaced with NumPy I/O routines such as
-np.load, np.fromfile as well as NumPy's memory-mapping capabilities.
-""")
-
-fwrite = deprecate(fwrite, message="""
-scipy.io.fwrite can be replaced with NumPy I/O routines such as np.save,
-np.savez and x.tofile. Also, files can be directly memory-mapped into NumPy
-arrays which is often a better way of reading large files.
-""")
-
-bswap = deprecate(bswap, message="""
-scipy.io.bswap can be replaced with the byteswap method on an array.
-out = scipy.io.bswap(arr) --> out = arr.byteswap(True)
-""")
-
-packbits = deprecate(packbits, message="""
-The functionality of scipy.io.packbits is now available as numpy.packbits
-The calling convention is a bit different, as the 2-d case is no
-longer specialized.
-
-However, you can simulate scipy.packbits by raveling the last 2 dimensions
-of the array and calling numpy.packbits with an axis=-1 keyword:
-
-def scipy_packbits(inp):
- a = np.asarray(inp)
- if a.ndim < 2:
- return np.packbits(a)
- oldshape = a.shape
- newshape = oldshape[:-2] + (oldshape[-2]*oldshape[-1],)
- a = np.reshape(a, newshape)
- return np.packbits(a, axis=-1).ravel()
-""")
-
-unpackbits = deprecate(unpackbits, message="""
-The functionality of scipy.io.unpackbits is now available in numpy.unpackbits
-The calling convention is different, however, as the 2-d case is no longer
-specialized.
-
-Thus, the scipy.unpackbits behavior must be simulated using numpy.unpackbits.
-
-def scipy_unpackbits(inp, els_per_slice, out_type=None):
- inp = np.asarray(inp)
- num4els = ((els_per_slice-1) >> 3) + 1
- inp = np.reshape(inp, (-1,num4els))
- res = np.unpackbits(inp, axis=-1)[:,:els_per_slice]
- return res.ravel()
-""")
-
-convert_objectarray = deprecate(convert_objectarray, message="""
-The same functionality can be obtained using NumPy string arrays and the
-.astype method (except for the optional missing value feature).
-""")
-
-# end deprecated
-
# matfile read and write
from matlab.mio import loadmat, savemat
Deleted: trunk/scipy/io/numpyiomodule.c
===================================================================
--- trunk/scipy/io/numpyiomodule.c 2010-06-18 13:02:16 UTC (rev 6523)
+++ trunk/scipy/io/numpyiomodule.c 2010-06-18 13:02:34 UTC (rev 6524)
@@ -1,1011 +0,0 @@
-/* numpyio.c -- Version 0.9.9
- *
- * Author: Travis E. Oliphant
- * Date : March 1999
- *
- * This file is a module for python that defines basically two functions for
- * reading from and writing to a binary file. It also has some functions
- * for byteswapping data and packing and unpacking bits.
- *
- * The data goes into a NumPy array object (multiarray)
- *
- * It is basically an implemetation of read and write with the data
- * going directly into a NumPy array
- *
- * Permission is granted to use this program however you see fit, but I give
- * no guarantees as to its usefulness or reliability. You assume full
- * responsibility for using this program.
- *
- * Thanks to Michael A. Miller <miller5 at uiuc.edu>
- * whose TableIO packages helped me learn how
- * to write an extension package. I've adapted his Makefile as well.
- */
-
-#include "Python.h" /* Python header files */
-#include "numpy/arrayobject.h"
-/* #include <math.h> */
-#include <stdio.h>
-
-void rbo(char *, int, int);
-void packbits(char *, int, char *, int, int);
-void unpackbits(char *, int, char *, int, int, int);
-int is_little_endian(void);
-
-static PyObject *ErrorObject; /* locally-raised exception */
-
-#define PYERR(message) do {PyErr_SetString(PyExc_ValueError, message); goto fail;} while(0)
-#define DATA(arr) ((arr)->data)
-#define DIMS(arr) ((arr)->dimensions)
-#define STRIDES(arr) ((arr)->strides)
-#define ELSIZE(arr) ((arr)->descr->elsize)
-#define OBJECTTYPE(arr) ((arr)->descr->type_num)
-#define BASEOBJ(arr) ((PyArrayObject *)((arr)->base))
-#define RANK(arr) ((arr)->nd)
-#define ISCONTIGUOUS(m) ((m)->flags & NPY_CONTIGUOUS)
-
-#define PYSETERROR(message) \
-{ PyErr_SetString(ErrorObject, message); goto fail; }
-
-#define INCREMENT(ret_ind, nd, max_ind) \
-{ \
- int k; \
- k = (nd) - 1; \
- if (++(ret_ind)[k] >= (max_ind)[k]) { \
- while (k >= 0 && ((ret_ind)[k] >= (max_ind)[k]-1)) \
- (ret_ind)[k--] = 0; \
- if (k >= 0) (ret_ind)[k]++; \
- else (ret_ind)[0] = (max_ind)[0]; \
- } \
-}
-
-#define CALCINDEX(indx, nd_index, strides, ndim) \
-{ \
- int i; \
- \
- indx = 0; \
- for (i=0; i < (ndim); i++) \
- indx += nd_index[i]*strides[i]; \
-}
-
-static PyObject *
- numpyio_fromfile(PyObject *self, PyObject *args) /* args: number of bytes and type */
-{
- PyObject *file;
- PyArrayObject *arr=NULL;
- PyArray_Descr *indescr=NULL;
- void *ibuff=NULL;
- int myelsize;
- int ibuff_cleared = 1;
- long n,nread;
- char read_type;
- FILE *fp;
- char dobyteswap = 0;
- int swap_factor;
- char out_type = 124; /* set to unused value */
- PyArray_VectorUnaryFunc *castfunc;
-
- if (!PyArg_ParseTuple( args, "Olc|cb" , &file, &n, &read_type, &out_type, &dobyteswap ))
- return NULL;
-
- if (out_type == 124)
- out_type = read_type;
-
- fp = PyFile_AsFile(file);
-
- if (fp == NULL) {
- PYSETERROR("First argument must be an open file");
- }
-
- if (n <= 0) {
- PYSETERROR("Second argument (number of bytes to read) must be positive.");
- }
- /* Make a 1-D NumPy array of type read_type with n elements */
-
- if ((arr = (PyArrayObject *)PyArray_SimpleNew(1,(npy_intp*)&n,out_type)) == NULL)
- return NULL;
-
- if (arr->descr->elsize == 0) {
- PYSETERROR("Does not support variable types.");
- }
-
- /* Read the data into the array from the file */
- if (out_type == read_type) {
- ibuff = arr -> data;
- myelsize = arr -> descr -> elsize;
- }
- else { /* Alocate a storage buffer for data read in */
- indescr = PyArray_DescrFromType((int ) read_type);
- if (indescr == NULL) goto fail;
- if (indescr->elsize == 0) {
- PYSETERROR("Does not support variable types.");
- }
- if (PyTypeNum_ISEXTENDED(indescr->type_num)) {
- PyErr_SetString(PyExc_ValueError,
- "Does not support extended types.");
- goto fail;
- }
- myelsize = indescr -> elsize;
- ibuff = malloc(myelsize*n);
- castfunc = indescr->f->cast[arr->descr->type_num];
- Py_DECREF(indescr);
- indescr=NULL;
- if (ibuff == NULL)
- PYSETERROR("Could not allocate memory for type casting")
- ibuff_cleared = 0;
- }
-
- nread = fread(ibuff,myelsize,n,fp);
- if (ferror(fp)) {
- clearerr(fp);
- PYSETERROR("There was an error reading from the file");
- }
-
- /* Check to see correct number of bytes were read. If not, then
- resize the array to the number of bytes actually read in.
- */
-
- if (nread < n) {
- fprintf(stderr,"Warning: %ld bytes requested, %ld bytes read.\n", n, nread);
- arr->dimensions[0] = nread;
- arr->data = realloc(arr->data,arr->descr->elsize*nread);
- }
-
- if (dobyteswap) {
- swap_factor = ((read_type=='F' || read_type=='D') ? 2 : 1);
- rbo(ibuff,myelsize/swap_factor,nread*swap_factor);
- }
-
- if (out_type != read_type) { /* We need to type_cast it */
- castfunc(ibuff, arr->data, nread, NULL, NULL);
- free(ibuff);
- ibuff_cleared = 1;
- }
-
- return PyArray_Return(arr);
-
- fail:
- Py_XDECREF(indescr);
- if (!ibuff_cleared) free(ibuff);
- Py_XDECREF(arr);
- return NULL;
-
-}
-
-static int write_buffered_output(FILE *fp, PyArrayObject *arr, PyArray_Descr* outdescr, char *buffer, int buffer_size, int bswap) {
-
- /* INITIALIZE N-D index */
-
- /* Loop over the N-D index filling the buffer with the data in arr
- (indexed correctly using strides)
- Each time dimension subdim is about to roll
- write the buffer to disk and fill it again. */
-
- char *buff_ptr, *output_ptr;
- int nwrite, *nd_index, indx;
- int buffer_size_bytes, elsize;
-
- buff_ptr = buffer;
- nd_index = (int *)calloc(arr->nd,sizeof(int));
- if (NULL == nd_index) {
- PyErr_SetString(ErrorObject,"Could not allocate memory for index array.");
- return -1;
- }
- buffer_size_bytes = buffer_size * arr->descr->elsize;
- while(nd_index[0] != arr->dimensions[0]) {
- CALCINDEX(indx,nd_index,arr->strides,arr->nd);
- memcpy(buff_ptr, arr->data+indx, arr->descr->elsize);
- buff_ptr += arr->descr->elsize;
- INCREMENT(nd_index,arr->nd,arr->dimensions);
- if ((buff_ptr - buffer) >= buffer_size_bytes) {
- buff_ptr = buffer;
-
- if (outdescr->type != arr->descr->type) { /* Cast to new type before writing */
- output_ptr = buffer + buffer_size_bytes;
- (arr->descr->f->cast[outdescr->type_num])(buffer,output_ptr,buffer_size,NULL, NULL);
- elsize = outdescr->elsize;
- }
- else {
- output_ptr = buffer;
- elsize = arr->descr->elsize;
- }
- if (bswap) {
- rbo((char *)output_ptr, elsize, buffer_size);
- }
-
- nwrite = fwrite(output_ptr, elsize, buffer_size, fp);
-
- if (ferror(fp)) {
- clearerr(fp);
- PyErr_SetString(ErrorObject,"There was an error writing to the file");
- return -1;
- }
- if (nwrite < buffer_size) {
- fprintf(stderr,"Warning: %d of %d specified bytes written.\n",nwrite, buffer_size);
- }
- }
-
- }
- return 0;
-}
-
-static PyObject *
- numpyio_tofile(PyObject *self, PyObject *args) /* args: number of bytes and type */
-{
- PyObject *file;
- PyArrayObject *arr = NULL;
- PyObject *obj;
- PyArray_Descr *outdescr=NULL;
- void *obuff = NULL;
- long n, k, nwrite, maxN, elsize_bytes;
- int myelsize, buffer_size;
- FILE *fp;
- char *buffer = NULL;
- char dobyteswap = 0;
- int swap_factor = 1;
- char ownalloc = 0;
- char write_type = 124;
-
- if (!PyArg_ParseTuple( args, "OlO|cb" , &file, &n, &obj, &write_type, &dobyteswap))
- return NULL;
-
- fp = PyFile_AsFile(file);
-
- if (fp == NULL) {
- PYSETERROR("First argument must be an open file");
- }
-
- if (!PyArray_Check(obj)) {
- PYSETERROR("Third argument must be a NumPy array.");
- }
-
- if (PyArray_ISEXTENDED(obj)) {
- PYSETERROR("Does not support extended types.");
- }
-
- maxN = PyArray_SIZE((PyArrayObject *)obj);
- if (n > maxN)
- PYSETERROR("The NumPy array does not have that many elements.");
-
- if (((PyArrayObject *)obj)->descr->type_num == PyArray_OBJECT)
- PYSETERROR("Cannot write an object array.");
-
- if (!PyArray_ISCONTIGUOUS((PyArrayObject *)obj)) {
- arr = (PyArrayObject *)PyArray_CopyFromObject(obj,((PyArrayObject *)obj) -> descr -> type_num, 0, 0);
- if (NULL == arr) { /* Memory allocation failed
- Write out buffered data using strides info */
- arr = (PyArrayObject *)obj;
- Py_INCREF(arr);
- if (write_type == 124)
- write_type = arr -> descr -> type;
-
- if (write_type != arr -> descr -> type) {
- outdescr = PyArray_DescrFromType((int) write_type);
- if (outdescr == NULL) goto fail;
- elsize_bytes = (outdescr->elsize + arr->descr->elsize); /* allocate space for buffer and casted buffer */
- }
- else {
- outdescr = arr->descr;
- Py_INCREF(outdescr);
- elsize_bytes = (arr->descr->elsize);
- }
- k = 0;
- do {
- k++;
- buffer_size = PyArray_MultiplyList(arr->dimensions + k, arr->nd - k);
- buffer = (char *)malloc(elsize_bytes*buffer_size);
- }
- while ((NULL == buffer) && (k < arr->nd - 1));
-
- if (NULL == buffer) /* Still NULL no size was small enough */
- PYSETERROR("Could not allocate memory for any attempted output buffer size.");
-
- /* Write a buffered output */
-
- if (write_buffered_output(fp, (PyArrayObject *)obj, outdescr, buffer, buffer_size, dobyteswap) < 0) {
- free(buffer);
- goto fail;
- }
- free(buffer);
- Py_DECREF(outdescr);
- Py_DECREF(arr);
- Py_INCREF(Py_None);
- return Py_None;
- }
- }
- else {
- arr = (PyArrayObject *)obj;
- Py_INCREF(arr);
- }
-
- /* Write the array to file (low-level data transfer) */
- if (n > 0) {
-
- if (write_type == 124) /* Wasn't specified: use input type */
- write_type = arr -> descr -> type;
-
- if (write_type == arr -> descr -> type) { /* point output buffer to data */
- obuff = arr -> data;
- myelsize = arr -> descr -> elsize;
- }
- else {
- if ((outdescr = PyArray_DescrFromType((int ) write_type)) == NULL)
- goto fail;
- myelsize = outdescr -> elsize;
- obuff = malloc(n*myelsize);
- if (obuff == NULL)
- PYSETERROR("Could not allocate memory for type-casting");
- ownalloc = 1;
- (arr->descr->f->cast[(int)outdescr->type_num])(arr->data,obuff,n,NULL,NULL);
- Py_DECREF(outdescr);
- outdescr=NULL;
- }
- /* Write the data from the array to the file */
- if (dobyteswap) {
- swap_factor = ((write_type=='F' || write_type=='D') ? 2 : 1);
- rbo((char *)obuff,myelsize/swap_factor,n*swap_factor);
- }
-
- nwrite = fwrite(obuff,myelsize,n,fp);
-
- if (dobyteswap) { /* Swap data in memory back if allocated obuff */
- if (write_type == arr -> descr -> type) /* otherwise we changed obuff only */
- rbo(arr->data,arr->descr->elsize/swap_factor,PyArray_SIZE(arr)*swap_factor);
- }
-
- if (ferror(fp)) {
- clearerr(fp);
- PYSETERROR("There was an error writing to the file");
- }
- if (nwrite < n) {
- fprintf(stderr,"Warning: %ld of %ld specified bytes written.\n",nwrite,n);
- }
- }
-
- if (ownalloc == 1) {
- free(obuff);
- }
-
- Py_DECREF(arr);
- Py_INCREF(Py_None);
- return Py_None;
-
- fail:
- Py_XDECREF(outdescr);
- if (ownalloc == 1) free(obuff);
- Py_XDECREF(arr);
- return NULL;
-
-}
-
-static PyObject *
- numpyio_byteswap(PyObject *self, PyObject *args) /* args: number of bytes and type */
-{
- PyArrayObject *arr = NULL;
- PyObject *obj;
- int type;
-
- if (!PyArg_ParseTuple( args, "O" , &obj))
- return NULL;
-
- type = PyArray_ObjectType(obj,0);
- if ((arr = (PyArrayObject *)PyArray_ContiguousFromObject(obj,type,0,0)) == NULL)
- return NULL;
-
- rbo(arr->data,arr->descr->elsize,PyArray_SIZE(arr));
-
- return PyArray_Return(arr);
-}
-
-static PyObject *
- numpyio_pack(PyObject *self, PyObject *args) /* args: in */
-{
- PyArrayObject *arr = NULL, *out = NULL;
- PyObject *obj;
- int els_per_slice;
- int out_size;
- int type;
-
- if (!PyArg_ParseTuple( args, "O" , &obj))
- return NULL;
-
- type = PyArray_ObjectType(obj,0);
- if ((arr = (PyArrayObject *)PyArray_ContiguousFromObject(obj,type,0,0)) == NULL)
- return NULL;
-
- if (arr->descr->type_num > PyArray_LONG)
- PYSETERROR("Expecting an input array of integer type (no floats).");
-
- /* Get size information from input array and make a 1-D output array of bytes */
-
- els_per_slice = arr->dimensions[arr->nd - 1];
- if (arr->nd > 1)
- els_per_slice = els_per_slice * arr->dimensions[arr->nd - 2];
-
- out_size = (PyArray_SIZE(arr)/els_per_slice)*ceil ( (float) els_per_slice / 8);
-
- if ((out = (PyArrayObject *)PyArray_SimpleNew(1,&out_size,PyArray_UBYTE))==NULL) {
- goto fail;
- }
-
- packbits(arr->data,arr->descr->elsize,out->data,PyArray_SIZE(arr),els_per_slice);
-
- Py_DECREF(arr);
- return PyArray_Return(out);
-
- fail:
- Py_XDECREF(arr);
- return NULL;
-
-}
-
-static PyObject *
- numpyio_unpack(PyObject *self, PyObject *args) /* args: in, out_type */
-{
- PyArrayObject *arr = NULL, *out=NULL;
- PyObject *obj;
- int els_per_slice, arrsize;
- int out_size, type;
- char out_type = 'b';
-
- if (!PyArg_ParseTuple( args, "Oi|c" , &obj, &els_per_slice, &out_type))
- return NULL;
-
- if (els_per_slice < 1)
- PYSETERROR("Second argument is elements_per_slice and it must be >= 1.");
-
- type = PyArray_ObjectType(obj,0);
- if ((arr = (PyArrayObject *)PyArray_ContiguousFromObject(obj,type,0,0)) == NULL)
- return NULL;
-
- arrsize = PyArray_SIZE(arr);
-
- if ((arrsize % (int) (ceil( (float) els_per_slice / 8))) != 0)
- PYSETERROR("That cannot be the number of elements per slice for this array size.");
-
- if (arr->descr->type_num > PyArray_LONG)
- PYSETERROR("Can only unpack arrays that are of integer type.");
-
- /* Make an 1-D output array of type out_type */
-
- out_size = els_per_slice * arrsize / ceil( (float) els_per_slice / 8);
-
- if ((out = (PyArrayObject *)PyArray_SimpleNew(1,&out_size,out_type))==NULL)
- goto fail;
-
- if (out->descr->type_num > PyArray_LONG) {
- PYSETERROR("Can only unpack bits into integer type.");
- }
-
- unpackbits(arr->data,arr->descr->elsize,out->data,out->descr->elsize,out_size,els_per_slice);
-
- Py_DECREF(arr);
- return PyArray_Return(out);
-
- fail:
- Py_XDECREF(out);
- Py_XDECREF(arr);
- return NULL;
-}
-
-
-static char fread_doc[] =
-"g = numpyio.fread( fid, Num, read_type { mem_type, byteswap})\n\n"
-" fid = open file pointer object (i.e. from fid = open('filename') )\n"
-" Num = number of elements to read of type read_type\n"
-" read_type = a character in 'cb1silfdFD' (PyArray types)\n"
-" describing how to interpret bytes on disk.\nOPTIONAL\n"
-" mem_type = a character (PyArray type) describing what kind of\n"
-" PyArray to return in g. Default = read_type\n"
-" byteswap = 0 for no byteswapping or a 1 to byteswap (to handle\n"
-" different endianness). Default = 0.";
-
-static char fwrite_doc[] =
-"numpyio.fwrite( fid, Num, myarray { write_type, byteswap} )\n\n"
-" fid = open file stream\n"
-" Num = number of elements to write\n"
-" myarray = NumPy array holding the data to write (will be\n"
-" written as if ravel(myarray) was passed)\nOPTIONAL\n"
-" write_type = character ('cb1silfdFD') describing how to write the\n"
-" data (what datatype to use) Default = type of\n"
-" myarray.\n"
-" byteswap = 0 or 1 to determine if byteswapping occurs on write.\n"
-" Default = 0.";
-
-static char bswap_doc[] =
-" out = numpyio.bswap(myarray)\n\n"
-" myarray = an array whose elements you want to byteswap.\n"
-" out = a reference to byteswapped myarray.\n\n"
-" This does an inplace byte-swap so that myarray is changed in\n"
-" memory.";
-
-static char packbits_doc[] =
-"out = numpyio.packbits(myarray)\n\n"
-" myarray = an array whose (assumed binary) elements you want to\n"
-" pack into bits (must be of integer type, 'cb1sl')\n\n"
-" This routine packs the elements of a binary-valued dataset into a\n"
-" 1-D NumPy array of type PyArray_UBYTE ('b') whose bits correspond to\n"
-" the logical (0 or nonzero) value of the input elements. \n\n"
-" If myarray has more dimensions than 2 it packs each slice (rows*columns)\n"
-" separately. The number of elements per slice (rows*columns) is\n"
-" important to know to be able to unpack the data later.\n\n"
-" Example:\n"
-" >>> a = array([[[1,0,1],\n"
-" ... [0,1,0]],\n"
-" ... [[1,1,0],\n"
-" ... [0,0,1]]])\n"
-" >>> b = numpyio.packbits(a)\n"
-" >>> b\n"
-" array([168, 196], 'b')\n\n"
-" Note that 168 = 128 + 32 + 8\n"
-" 196 = 128 + 64 + 4";
-
-static char unpackbits_doc[] =
-"out = numpyio.unpackbits(myarray, elements_per_slice {, out_type} )\n\n"
-" myarray = Array of integer type ('cb1sl') whose least\n"
-" significant byte is a bit-field for the\n"
-" resulting output array.\n\n"
-" elements_per_slice = Necessary for interpretation of myarray.\n"
-" This is how many elements in the\n "
-" rows*columns of original packed structure.\n\nOPTIONAL\n"
-" out_type = The type of output array to populate with 1's\n"
-" and 0's. Must be an integer type.\n\n\nThe output array\n"
-" will be a 1-D array of 1's and zero's";
-
-
-#define BUFSIZE 256
-/* Convert a Python string object to a complex number */
-static int convert_from_object(PyObject *obj, Py_complex *cnum)
-{
- PyObject *res=NULL, *elobj=NULL;
- PyObject *newstr=NULL, *finalobj=NULL, *valobj=NULL;
- char strbuffer[2*BUFSIZE];
- char *xptr, *elptr;
- char *newstrbuff, thischar;
- char buffer[BUFSIZE];
- char validnum[] = "0123456789.eE+-";
- int validlen = 15;
- int inegflag = 1;
- int rnegflag = 1;
- int n, k, m, i, elN, size, state, count;
- double val;
-
- if (!PyString_Check(obj)) return -1;
-
- /* strip string */
- newstr = PyObject_CallMethod(obj, "strip", NULL);
- if (newstr == NULL) goto fail;
-
- /* Replace any 'e+' or 'e-' */
- size = PyString_GET_SIZE(newstr);
- newstrbuff = PyString_AsString(newstr);
- if (newstrbuff == NULL) goto fail;
- if (size > 2*BUFSIZE) PYERR("String too large.");
-
- state = 0;
- count = 0;
- for (k=0; k<size; k++) {
- thischar = newstrbuff[k];
- if (state == 1) {
- if (thischar == '+') {
- thischar = '\254';
- }
- else if (thischar == '-') {
- thischar = '\253';
- }
- }
- if ((thischar == 'e') || (thischar == 'E')) state = 1;
- else state = 0;
- strbuffer[count] = thischar;
- count++;
- }
- Py_DECREF(newstr);
- newstr = PyString_FromStringAndSize(strbuffer, count);
- if (newstr == NULL) goto fail;
- xptr = strbuffer;
-
- /* Split the string into two substrings first on a ',' then on a '+'
- or '-' */
- res = PyObject_CallMethod(newstr, "split", "s", ",");
- if (res == NULL) goto fail;
- if (PySequence_Size(res) < 2) {
- Py_DECREF(res);
- res = PyObject_CallMethod(newstr, "split", "s", "+");
- if (res == NULL) goto fail;
- }
- if (PySequence_Size(res) < 2) {
- if ((strbuffer[0] == '(') || (strbuffer[0] == '[') ||
- (strbuffer[0] == '{')) {
- xptr++;
- count--;
- /* strip leading whitespaces */
- while (isspace(*xptr)) {xptr++; count--;}
- }
- if (xptr[0] == '-') {
- rnegflag = -1;
- xptr++;
- count--;
- }
- Py_DECREF(newstr);
- newstr = PyString_FromStringAndSize(xptr, count);
- if (newstr == NULL) goto fail;
- Py_DECREF(res);
- res = PyObject_CallMethod(newstr, "split", "s", "-");
- if (res == NULL) goto fail;
- inegflag = -1;
- }
-
- size = PySequence_Size(res);
- for (k=0; k < NPY_MIN(size,2); k++) {
- elobj = PySequence_GetItem(res, k);
- if (elobj == NULL) goto fail;
- elN = PyString_Size(elobj);
- if ((elN > BUFSIZE))
- PYSETERROR("String too large.");
-
- /* Replace back the + and - and strip away invalid characters */
- elptr = PyString_AsString(elobj);
- m = 0;
- for (n=0; n < elN; n++) {
- thischar = elptr[n];
- if (thischar == '\254')
- buffer[m++] = '+';
- else if (thischar == '\253')
- buffer[m++] = '-';
- else {
- for (i=0; i< validlen; i++) {
- if (thischar == validnum[i]) break;
- }
- if (i < validlen) buffer[m++] = thischar;
- }
- }
- finalobj = PyString_FromStringAndSize(buffer, m);
- if (finalobj == NULL) goto fail;
- valobj = PyFloat_FromString(finalobj, NULL); /* Try to make a float */
- if (valobj == NULL) goto fail;
- val = PyFloat_AsDouble(valobj);
- if (PyErr_Occurred()) goto fail;
- Py_DECREF(finalobj);
- Py_DECREF(valobj);
- Py_DECREF(elobj);
- if (k==0) {
- cnum->real = val*rnegflag;
- }
- else {
- cnum->imag = val*inegflag;
- }
-
- }
- Py_DECREF(newstr);
- Py_DECREF(res);
- return 0;
-
- fail:
- Py_XDECREF(res);
- Py_XDECREF(elobj);
- Py_XDECREF(newstr);
- Py_XDECREF(finalobj);
- Py_XDECREF(valobj);
- return -1;
-}
-
-
-
-static int PyTypeFromChar(char ctype)
-{
- switch(ctype) {
- case 'c': return PyArray_CHAR;
- case 'b': return PyArray_UBYTE;
- case '1': return PyArray_BYTE;
- case 's': return PyArray_SHORT;
- case 'i': return PyArray_INT;
-#ifdef PyArray_UNSIGNED_TYPES
- case 'u': return PyArray_UINT;
- case 'w': return PyArray_USHORT;
-#endif
- case 'l': return PyArray_LONG;
- case 'f': return PyArray_FLOAT;
- case 'd': return PyArray_DOUBLE;
- case 'F': return PyArray_CFLOAT;
- case 'D': return PyArray_CDOUBLE;
- case 'O': return PyArray_OBJECT;
- }
- return PyArray_NOTYPE;
-}
-
-
-static PyObject *
- numpyio_convert_objects(PyObject *self, PyObject *args)
-{
- PyObject *obj = NULL, *missing_val = NULL;
- PyArrayObject *arr = NULL, *out=NULL;
- PyArrayObject *missing_arr = NULL;
- PyArray_Descr *descr;
- PyObject *builtins, *dict;
- char out_type;
- int int_type, i, err;
- char *outptr;
- PyObject **arrptr;
- PyObject *numobj=NULL;
- PyObject *comp_obj;
- Py_complex numc;
- PyArray_VectorUnaryFunc *funcptr;
-
- if (!PyArg_ParseTuple( args, "Oc|O" , &obj, &out_type, &missing_val))
- return NULL;
-
- if (missing_val == NULL) {
- missing_val = PyInt_FromLong(0);
- }
- else {
- Py_INCREF(missing_val); /* Increment missing_val for later DECREF */
- }
-
- int_type = PyTypeFromChar(out_type);
- if ((int_type == PyArray_NOTYPE) || (int_type == PyArray_OBJECT) || \
- PyTypeNum_ISEXTENDED(int_type))
- PYERR("Invalid output type.");
-
- missing_arr = (PyArrayObject *)PyArray_ContiguousFromObject(missing_val,
- int_type, 0, 0);
- Py_DECREF(missing_val);
- missing_val = NULL; /* So later later failures don't decrement it */
-
- if ((missing_arr == NULL)) goto fail;
- if ((RANK(missing_arr) > 0)) PYERR("Missing value must be as scalar");
-
- arr = (PyArrayObject *)PyArray_ContiguousFromObject(obj, PyArray_OBJECT,
- 0, 0);
- if (arr == NULL) goto fail;
-
- out = (PyArrayObject *)PyArray_SimpleNew(RANK(arr), DIMS(arr), int_type);
- if (out == NULL) goto fail;
-
- /* Get the builtin_functions from the builtin module */
- builtins = PyImport_AddModule("__builtin__");
- if (builtins == NULL) goto fail;
-
- dict = PyModule_GetDict(builtins);
- comp_obj = PyDict_GetItemString(dict, "complex");
- if (comp_obj == NULL) goto fail;
-
- /* get_complex = PyDict_GetItemString(dict, "complex");
- get_float = PyDict_GetItemString(dict, "float");
- get_int = PyDict_GetItemString(dict, "int");
- if ((get_complex == NULL) || (get_float == NULL) || (get_int == NULL) ) goto fail;
- */
- /*
- get_complex_self = PyCFunction_GetSelf(PyDict_GetItemString(dict, "complex"));
- get_float_self = PyCFunction_GetSelf(PyDict_GetItemString(dict, "float"));
- get_int_self = PyCFunction_GetSelf(PyDict_GetItemString(dict, "int"));
- */
-
- /* Loop through arr and convert each element and place in out */
- i = PyArray_Size((PyObject *)arr);
- arrptr = ((PyObject **)DATA(arr)) - 1;
- outptr = (DATA(out)) - ELSIZE(out);
-
- descr = PyArray_DescrFromType(PyArray_CDOUBLE);
- funcptr = descr->f->cast[int_type];
- Py_DECREF(descr);
-
- while (i--) {
- outptr += ELSIZE(out);
- arrptr += 1;
- numc.real = 0;
- numc.imag = 0;
- numobj = PyObject_CallFunction(comp_obj, "O", *arrptr);
- if (numobj != NULL) {
- numc = PyComplex_AsCComplex(numobj);
- Py_DECREF(numobj);
- }
- if (PyErr_Occurred()) { /* Use our own homegrown converter... */
- PyErr_Clear();
- err = convert_from_object(*arrptr, &numc);
- if (PyErr_Occurred()) PyErr_Clear();
- if (err < 0) { /* Nothing works fill with missing value... */
- memcpy(outptr, DATA(missing_arr), ELSIZE(out));
- }
- }
- /* Place numc into the array */
- funcptr((void *)&(numc.real), (void *)outptr, 1, NULL, NULL);
- }
-
- Py_DECREF(missing_arr);
- Py_DECREF(arr);
- return PyArray_Return(out);
-
- fail:
- Py_XDECREF(out);
- Py_XDECREF(arr);
- Py_XDECREF(missing_arr);
- Py_XDECREF(missing_val);
- return NULL;
-}
-
-
-static char convert_objects_doc[] =
-"convert_objectarray(myarray, arraytype{, missing_value} ) -> out \n\n"
-" myarray = Sequence of strings.\n"
-" arraytype = Type of output array.\n"
-" missing_value = Value to insert when conversion fails.";
-
-/* *************************************************************************** */
-/* Method registration table: name-string -> function-pointer */
-
-static struct PyMethodDef numpyio_methods[] = {
- {"fread", numpyio_fromfile, 1, fread_doc},
- {"fwrite", numpyio_tofile, 1, fwrite_doc},
- {"bswap", numpyio_byteswap, 1, bswap_doc},
- {"packbits", numpyio_pack, 1, packbits_doc},
- {"unpackbits", numpyio_unpack, 1, unpackbits_doc},
- {"convert_objectarray", numpyio_convert_objects, 1, convert_objects_doc},
- {NULL, NULL}
-};
-
-PyMODINIT_FUNC initnumpyio(void)
-{
- PyObject *m, *d;
-
- import_array(); /* allows multiarray to be a shared library (I think) */
- /* Should be defined in arrayobject.h */
-
- /* create the module and add the functions */
- m = Py_InitModule("numpyio", numpyio_methods); /* registration hook */
-
- /* add symbolic constants to the module */
- d = PyModule_GetDict(m);
- ErrorObject = Py_BuildValue("s", "numpyio.error"); /* export exception */
- PyDict_SetItemString(d, "error", ErrorObject); /* add more if need */
-
-}
-
-/**********************************************************/
-/* */
-/* SYNOPSIS: rbo(data, bpe, nel) ; */
-/* where: */
-/* nel..... number of array elements */
-/* data.... pointer to the first byte in the */
-/* array */
-/* bpe..... bytes per array element */
-/* */
-/* PURPOSE: convert data from little to big endian (and */
-/* visa-versa) */
-/* */
-/**********************************************************/
-
-void rbo(char * data, int bpe, int nel)
-{
- int nswaps, i,j; /* number of swaps to make per element */
- char tmp; /* temporary storage for swapping */
- long int p1, p2; /* indexes for elements to be swapped */
-
- nswaps = bpe / 2; /* divide element size by two */
- if (nswaps == 0) return; /* return if it is a byte array */
-
- p1 = 0;
- for ( i=0; i<nel; i++) {
- p1 = i*bpe;
- p2 = p1 + bpe - 1;
- for (j=0; j<nswaps; j++) {
- tmp = data[p1];
- data[p1] = data[p2];
- data[p2] = tmp;
- p1++;
- p2--;
- }
- }
- return;
-}
-
-/* PACKBITS
-
-
- This function packs binary (0 or 1) 1-bit per pixel images
- into bytes for writing to disk.
-
-*/
-
-void packbits(
- char In[],
- int element_size, /* in bytes */
- char Out[],
- int total_elements,
- int els_per_slice
- )
-{
- char build;
- int i,index,slice,slices,out_bytes;
- int maxi, remain, nonzero, j;
- char *outptr,*inptr;
-
- outptr = Out; /* pointer to output buffer */
- inptr = In; /* pointer to input buffer */
- slices = total_elements/els_per_slice;
- out_bytes = ceil( (float) els_per_slice / 8); /* number of bytes in each slice */
- remain = els_per_slice % 8; /* uneven bits */
- if (remain == 0) remain = 8; /* */
- /* printf("Start: %d %d %d %d %d\n",inM,MN,slices,out_bytes,remain);
- */
- for (slice = 0; slice < slices; slice++) {
- for (index = 0; index < out_bytes; index++) {
- build = 0;
- maxi = (index != out_bytes - 1 ? 8 : remain);
- for (i = 0; i < maxi ; i++) {
- build <<= 1; /* shift bits left one bit */
- nonzero = 0;
- for (j = 0; j < element_size; j++) /* determine if this number is non-zero */
- nonzero += (*(inptr++) != 0);
- build += (nonzero > 0); /* add to this bit if the input value is non-zero */
- }
- if (index == out_bytes - 1) build <<= (8-remain);
- /* printf("Here: %d %d %d %d\n",build,slice,index,maxi);
- */
- *(outptr++) = build;
- }
- }
- return;
-}
-
-
-void unpackbits(
- char In[],
- int in_element_size,
- char Out[],
- int element_size,
- int total_elements,
- int els_per_slice
- )
-{
- unsigned char mask;
- int i,index,slice,slices,out_bytes;
- int maxi, remain;
- char *outptr,*inptr;
-
- outptr = Out;
- inptr = In;
- if (is_little_endian()) {
- fprintf(stderr,"This is a little-endian machine.\n");
- }
- else {
- fprintf(stderr,"This is a big-endian machine.\n");
- outptr += (element_size - 1);
- inptr += (in_element_size - 1);
- }
- slices = total_elements / els_per_slice;
- out_bytes = ceil( (float) els_per_slice / 8);
- remain = els_per_slice % 8;
- if (remain == 0) remain = 8;
- /* printf("Start: %d %d %d %d %d\n",inM,MN,slices,out_bytes,remain);
- */
- for (slice = 0; slice < slices; slice++) {
- for (index = 0; index < out_bytes; index++) {
- maxi = (index != out_bytes - 1 ? 8 : remain);
- mask = 128;
- for (i = 0; i < maxi ; i++) {
- *outptr = ((mask & (unsigned char)(*inptr)) > 0);
- outptr += element_size;
- mask >>= 1;
- }
- /* printf("Here: %d %d %d %d\n",build,slice,index,maxi);
- */
- inptr += in_element_size;
- }
- }
- return;
-}
-
-int is_little_endian()
-{ /* high low */
- short testnum = 1; /* If little endian it will be 0x00 0x01 */
- /* If big endian it will be 0x01 0x00 */
- void *testptr;
- char *myptr;
-
- testptr = (void *)(&testnum); /* Assumes address gives low-byte in memory */
- myptr = (char*)testptr;
-
- return (*(myptr) == 1);
-
-}
-
-
Modified: trunk/scipy/io/setup.py
===================================================================
--- trunk/scipy/io/setup.py 2010-06-18 13:02:16 UTC (rev 6523)
+++ trunk/scipy/io/setup.py 2010-06-18 13:02:34 UTC (rev 6524)
@@ -4,9 +4,6 @@
from numpy.distutils.misc_util import Configuration
config = Configuration('io', parent_package, top_path)
- config.add_extension('numpyio',
- sources = ['numpyiomodule.c'])
-
config.add_data_dir('tests')
config.add_data_dir('examples')
config.add_data_dir('docs')
More information about the Scipy-svn
mailing list