Package SpecClient :: Module SpecArray
[hide private]
[frames] | no frames]

Source Code for Module SpecClient.SpecArray

  1  import types 
  2  import logging 
  3   
  4  try: 
  5      import numpy 
  6  except: 
  7      numpy = None 
  8   
  9  try: 
 10      import Numeric 
 11  except: 
 12      Numeric = None 
 13      #if numpy is None: 
 14      #    logging.getLogger('SpecClient').warning('Cannot load numpy or Numeric: use Python array instead') 
 15   
 16  (ARRAY_DOUBLE, ARRAY_FLOAT, ARRAY_LONG, ARRAY_ULONG, ARRAY_SHORT, \ 
 17   ARRAY_USHORT, ARRAY_CHAR, ARRAY_UCHAR, \ 
 18   ARRAY_STRING, ARRAY_NUMERIC) = (5,6,7,8,9,10,11,12,13,14) 
 19   
 20  (ARRAY_MIN, ARRAY_MAX) = (ARRAY_DOUBLE, ARRAY_STRING) 
 21   
 22  if numpy is not None: 
 23      SPEC_TO_NUM = { 
 24          ARRAY_CHAR   :  numpy.byte, 
 25          ARRAY_UCHAR  :  numpy.ubyte, 
 26          ARRAY_SHORT  :  numpy.short, 
 27          ARRAY_USHORT :  numpy.ushort, 
 28          ARRAY_LONG   :  numpy.int32, 
 29          ARRAY_ULONG  :  numpy.uint32, 
 30          ARRAY_FLOAT  :  numpy.float32, 
 31          ARRAY_DOUBLE :  numpy.float64 
 32          } 
 33   
 34      NUM_TO_SPEC = { 
 35          numpy.ubyte : ARRAY_CHAR, 
 36          numpy.uint : ARRAY_ULONG, 
 37          numpy.uint16 : ARRAY_USHORT, 
 38          numpy.uint32 : ARRAY_ULONG, 
 39          numpy.uint8 : ARRAY_CHAR, 
 40          numpy.ushort : ARRAY_USHORT, 
 41          numpy.short : ARRAY_SHORT, 
 42          numpy.int32 : ARRAY_LONG, 
 43          numpy.int8 : ARRAY_CHAR, 
 44          numpy.float : ARRAY_FLOAT, 
 45          numpy.float32 : ARRAY_FLOAT, 
 46          numpy.float64 : ARRAY_DOUBLE 
 47          } 
48 - def IS_ARRAY(data) :
49 return isinstance(data,numpy.ndarray)
50 else: 51 NUM_TO_SPEC = { 52 '1' : ARRAY_CHAR, 53 'b' : ARRAY_UCHAR, 54 's' : ARRAY_SHORT, 55 'w' : ARRAY_USHORT, #added 56 'l' : ARRAY_LONG, 57 'u' : ARRAY_ULONG, #added 58 'f' : ARRAY_FLOAT, 59 'd' : ARRAY_DOUBLE 60 } 61 62 SPEC_TO_NUM = { 63 ARRAY_CHAR : '1', 64 ARRAY_UCHAR : 'b', 65 ARRAY_SHORT : 's', 66 ARRAY_USHORT : 'w', # was 's', Works with input array of type long 67 ARRAY_LONG : 'l', 68 ARRAY_ULONG : 'u', # was 'l', Doesn't really work well 69 ARRAY_FLOAT : 'f', 70 ARRAY_DOUBLE : 'd' 71 } 72
73 - def IS_ARRAY(data) :
74 return isinstance(data,Numeric.ArrayType)
75
76 -class SpecArrayError(Exception):
77 pass
78 79
80 -def isArrayType(datatype):
81 return type(datatype) == types.IntType and datatype >= ARRAY_MIN and datatype <= ARRAY_MAX
82 83
84 -def SpecArray(data, datatype = ARRAY_CHAR, rows = 0, cols = 0):
85 if isinstance(data, SpecArrayData): 86 # create a SpecArrayData from a SpecArrayData ("copy" constructor) 87 return SpecArrayData(data.data, data.type, data.shape) 88 89 if datatype == ARRAY_STRING: 90 # a list of strings 91 newArray = filter(None, [x != chr(0) and x or None for x in data.split(chr(0))]) 92 return newArray 93 else: 94 newArray = None 95 96 if numpy is not None or Numeric is not None: 97 if IS_ARRAY(data) : 98 # convert from a Num* array to a SpecArrayData instance 99 # (when you send) 100 if len(data.shape) > 2: 101 raise SpecArrayError, "Spec arrays cannot have more than 2 dimensions" 102 103 try: 104 if type(data) == numpy.ndarray: 105 numtype = data.dtype.type 106 datatype = NUM_TO_SPEC[numtype] 107 else: 108 numtype = data.typecode() 109 datatype = NUM_TO_SPEC[numtype] 110 except KeyError: 111 data = '' 112 datatype = ARRAY_CHAR 113 rows = 0 114 cols = 0 115 logging.getLogger('SpecClient').error("Numerical type '%s' not supported" , numtype) 116 else: 117 if len(data.shape) == 2: 118 rows, cols = data.shape 119 else: 120 rows, cols = 1, data.shape[0] 121 data = data.tostring() 122 123 newArray = SpecArrayData(data, datatype, (rows, cols)) 124 else: 125 # return a new Num* array from data 126 # (when you receive) 127 try: 128 numtype = SPEC_TO_NUM[datatype] 129 except: 130 raise SpecArrayError, 'Invalid Spec array type' 131 else: 132 if numpy: 133 newArray = numpy.fromstring(data, dtype=numtype) 134 else: 135 newArray = Numeric.fromstring(data, numtype) 136 137 if rows==1: 138 newArray.shape = (cols, ) 139 else: 140 newArray.shape = (rows, cols) 141 else: 142 if isArrayType(datatype): 143 newArray = SpecArrayData(data, datatype) 144 else: 145 raise SpecArrayError, 'Invalid Spec array type' 146 147 return newArray
148 149
150 -class SpecArrayData:
151 - def __init__(self, data, datatype, shape):
152 self.data = data 153 self.type = datatype 154 self.shape = shape
155 156
157 - def tostring(self):
158 return str(self.data)
159