This source file and makefile are intended to be used with python with Numerical extensions. To install: 1) copy Makefile.pre.in from your python configuration directory (e.g. /usr/lib/python1.5/config/Makefile.pre.in) to this directory. 2) make -f Makefile.pre.in boot 3) make 4) install in a directory on your Python path. executing make once compiles both sigtools and numpyio. There is a module called mIO.py that defines MATLAB-like binary file interface using numpyio. It is a recommended front-end for numpyio and imported into signaltools.py Usage: import mIO fid = mIO.fopen('somefile','r','ieee-le') # little-endian somedata = fid.fread(number_of_els,type) # type can be all kinds of things # like int32, float, complex, etc. # check mIO.py for details # somedata is 1-D array of number_of_els (set the shape to whatever you want There are useful methods called fort_write and fort_read to this object that allow you to use the struct module syntax to read in FORTRAN records into a list and write FORTRAN records. Any Questions or problems or bug-reports send to Oliphant.Travis@altavista.net Background: Once compiled, numpyio is a loadable module that can be used in python for reading and writing arbitrary binary data to and from Numerical Python arrays. I work in Medical Imaging and often have large data sets to manipulate. I came from a background of using MATLAB but only having doubles to work with really puts a crimp on the sizes of the data sets I could manipulate. The fact that Numerical Python has more data types defined than doubles encouraged me to try it out. I have been very impressed with its speed and utility, but I needed some way to read large data sets from an arbitrary binary file into Numerical Python arrays. I didn't see any obvious way to do this so I wrote an extension module. Although there is not much documentation, having the sources available is ultimately better than documentation. Description: The module defines 5 methods for reading and writing NumPy arrays: ******************************************************************** g = numpyio.fread( fid, Num, read_type { mem_type, byteswap}) fid = open file pointer object (i.e. from fid = open("filename") ) Num = number of elements to read of type read_type read_type = a character in 'cb1silfdFD' (PyArray types) describing how to interpret bytes on disk. OPTIONAL mem_type = a character (PyArray type) describing what kind of PyArray to return in g. Default = read_type byteswap = 0 for no byteswapping or a 1 to byteswap (to handle different endianness). Default = 0 ************************************************************************ numpyio.fwrite( fid, Num, myarray { write_type, byteswap} ) fid = open file stream Num = number of elements to write myarray = NumPy array holding the data to write (will be written as if ravel(myarray) was passed) OPTIONAL write_type = character ('cb1silfdFD') describing how to write the data (what datatype to use) Default = type of myarray. byteswap = 0 or 1 to determine if byteswapping occurs on write. Default = 0. These are the main routines, note that mem_type or write_type is specified then a blind typecast is done with no checking to see if it makes sense to do so. I'm trusting the user knows what she wants to do. Three support routines are also included. ************************************ numpyio.bswap(myarray) myarray = an array whose elements you want to byteswap. This does an inplace byte-swap so that myarray is changed in memory. ********************************************************* out = numpyio.packbits(myarray) myarray = an array whose (assumed binary) elements you want to pack into bits (must be of integer type, 'cb1sl') This routine packs the elements of a binary-valued dataset into a 1-D NumPy array of type PyArray_UBYTE ('b') whose bits correspond to the logical (0 or nonzero) value of the input elements. If myarray has more dimensions than 2 it packs each slice (rows*columns) separately. The number of elements per slice (rows*columns) is important to know to be able to unpack the data later. Example: >>> a = array([[[1,0,1], ... [0,1,0]], ... [[1,1,0], ... [0,0,1]]]) >>> b = numpyio.packbits(a) >>> b array([168, 196], 'b') Note that 168 = 128 + 32 + 8 196 = 128 + 64 + 4 ***************************************************************** out = numpyio.unpackbits(myarray, elements_per_slice {, out_type} ) myarray = Array of integer type ('cb1sl') whose least significant byte is a bit-field for the resulting output array. elements_per_slice = Necessary for interpretation of myarray. This is how many elements in the rows*columns of original packed structure. OPTIONAL out_type = The type of output array to populate with 1's and 0's. Must be an integer type. The output array will be a 1-D array of 1's and zero's Example: (See above) (It prints out a nice message saying how your machine interprets multibyte numbers.) >>> c = numpyio.unpackbits(b,6) This is a little-endian machine >>> c array([1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1],'b') ******************************************************************** Enjoy, Travis