def _data2string(data, form): '''Converts a data element to binary, text or base64 representation''' if isinstance(data, basestring): return ('"%s"' % encode_escape(data)).encode() elif type(data) is np.ndarray: if form == 'text' or types.numpy_data_isstring(data): f = types.numpy_data2printer(data) nrows, ncols = data.shape return _TEXT_ROWSEP.join([ _TEXT_COLSEP.join([f(data[row, col]) for col in xrange(ncols)]) for row in xrange(nrows) ]).encode() elif form == 'binary': data_reshaped = data.reshape((data.shape[1], data.shape[0])) r = data_reshaped.tostring() debug( 'NIML', 'Binary encoding (len %d -> %d): [%s]' % (data_reshaped.size, len(r), _partial_string(r, 0))) return r elif form == 'base64': data_reshaped = data.reshape((data.shape[1], data.shape[0])) r = base64.b64encode(data_reshaped.tostring()) debug('NIML', 'Encoding ok: [%s]', _partial_string(r, 0)) return r else: raise ValueError("illegal format %s" % format) elif type(data) is list: # mixed types, each column in its own container # always use text output format, even if requested form is binary of base64 ncols = len(data) if ncols == 0: return "".encode() else: nrows = len(data[0]) # separate formatter functions for each column # if list of strings then take first element of the list to get a string formattr # else use the entire np array to get a numeric formatter fs = [ types.numpy_data2printer(d[0] if type(d) is list else d) for d in data ] return _TEXT_ROWSEP.join([ _TEXT_COLSEP.join( [fs[col](data[col][row]) for col in xrange(ncols)]) for row in xrange(nrows) ]).encode() else: raise TypeError("Unknown type %r" % type(data))
def _data2string(data, form): '''Converts a data element to binary, text or base64 representation''' if isinstance(data, basestring): return ('"%s"' % encode_escape(data)).encode() elif type(data) is np.ndarray: if form == 'text': f = types.numpy_data2printer(data) nrows, ncols = data.shape return _TEXT_ROWSEP.join([_TEXT_COLSEP.join([f(data[row, col]) for col in xrange(ncols)]) for row in xrange(nrows)]).encode() elif form == 'binary': data_reshaped = data.reshape((data.shape[1], data.shape[0])) r = data_reshaped.tostring() debug('NIML', 'Binary encoding (len %d -> %d): [%s]' % (data_reshaped.size, len(r), _partial_string(r, 0))) return r elif form == 'base64': data_reshaped = data.reshape((data.shape[1], data.shape[0])) r = base64.b64encode(data_reshaped.tostring()) debug('NIML', 'Encoding ok: [%s]', _partial_string(r, 0)) return r else: raise ValueError("illegal format %s" % format) elif type(data) is list: # mixed types, each column in its own container # always use text output format, even if requested form is binary of base64 ncols = len(data) if ncols == 0: return "".encode() else: nrows = len(data[0]) # separate formatter functions for each column # if list of strings then take first element of the list to get a string formattr # else use the entire np array to get a numeric formatter fs = [types.numpy_data2printer(d[0] if type(d) is list else d) for d in data] return _TEXT_ROWSEP.join([_TEXT_COLSEP.join([fs[col](data[col][row]) for col in xrange(ncols)]) for row in xrange(nrows)]).encode() else: raise TypeError("Unknown type %r" % type(data))
def _dset2rawniml_datarange(s): data = s['data'] minpos = np.argmin(data, axis=0) maxpos = np.argmax(data, axis=0) f = types.numpy_data2printer(data) # formatter function r = [] for i in xrange(len(minpos)): mnpos = minpos[i] mxpos = maxpos[i] r.append('%s %s %d %d' % (f(data[mnpos, i]), f(data[mxpos, i]), mnpos, mxpos)) # range of data in each column return dict(atr_name='COLMS_RANGE', data=r)