def _mixedtypes_datastring2rawniml(s, niml): tps = niml['vec_typ'] ncols = len(tps) nrows = niml['vec_len'] lines = s.strip().split(_TEXT_ROWSEP) if len(lines) != nrows: raise ValueError("Expected %d rows, but found %d" % (nrows, len(lines))) elems = map(lambda x: x.strip().split(_TEXT_COLSEP), lines) fs = map(types.code2python_convertor, tps) data = [] for col in xrange(ncols): f = fs[col] if types.sametype(tps[col], 'String'): d = map(f, [elems[r][col] for r in xrange(nrows)]) else: tp = types.code2numpy_type(tps[col]) niform = niml.get('ni_form', None) if not niform is None: raise ValueError( 'Not supported: have ni_form with mixed types') d = np.zeros((nrows, ), dtype=tp) # allocate one-dimensional array for r in xrange(nrows): d[r] = f(elems[r][col]) data.append(d) return data
def _binary_data_bytecount(niml): '''helper function that returns how many bytes a NIML binary data element should have''' niform = niml['ni_form'] if not 'binary' in niform: raise ValueError('Illegal niform %s' % niform) tps = niml['vec_typ'] onetype = types.findonetype(tps) if onetype is None: debug('NIML', 'Not unique type: %r', tps) return None # numeric, either int or float ncols = niml['vec_num'] nrows = niml['vec_len'] tp = types.code2numpy_type(onetype) bytes_per_elem = types.numpy_type2bytecount(tp) if bytes_per_elem is None: raise ValueError("Type not supported: %r" % onetype) nb = ncols * nrows * bytes_per_elem debug('NIML', 'Number of bytes for %s: %d x %d with %d bytes / element', (niform, ncols, nrows, bytes_per_elem)) return nb
def _mixedtypes_datastring2rawniml(s, niml): tps = niml['vec_typ'] ncols = len(tps) nrows = niml['vec_len'] lines = s.strip().split(_TEXT_ROWSEP) if len(lines) != nrows: raise ValueError("Expected %d rows, but found %d" % (nrows, len(lines))) elems = map(lambda x : x.strip().split(_TEXT_COLSEP), lines) fs = map(types.code2python_convertor, tps) data = [] for col in xrange(ncols): f = fs[col] if types.sametype(tps[col], 'String'): d = map(f, [elems[r][col] for r in xrange(nrows)]) else: tp = types.code2numpy_type(tps[col]) niform = niml.get('ni_form', None) if not niform is None: raise ValueError('Not supported: have ni_form with mixed types') d = np.zeros((nrows,), dtype=tp) # allocate one-dimensional array for r in xrange(nrows): d[r] = f(elems[r][col]) data.append(d) return data
def _datastring2rawniml(s, niml): '''Converts data with uniform type to raw NIML''' debug('NIML', 'Raw string to NIML: %d characters', len(s)) tps = niml['vec_typ'] onetype = types.findonetype(tps) if onetype is None or ([onetype] == types.str2codes('string') and len(tps) > 1): return _mixedtypes_datastring2rawniml(s, niml) if [onetype] == types.str2codes('string'): # single string return decode_escape(s.decode()) # do not string2rawniml # numeric, either int or float ncols = niml['vec_num'] nrows = niml['vec_len'] tp = types.code2numpy_type(onetype) niform = niml.get('ni_form', None) if not niform or niform == 'text': data = np.zeros((nrows, ncols), dtype=tp) # allocate space for data convertor = types.code2python_convertor( onetype) # string to type convertor vals = s.split(None) # split by whitespace seperator if len(vals) != ncols * nrows: raise ValueError("unexpected number of elements") for i, val in enumerate(vals): data[i // ncols, i % ncols] = convertor(val) else: dtype = np.dtype(tp) dtype = types.byteorder_from_niform(niform, dtype) if 'base64' in niform: debug('NIML', 'base64, %d chars: %s', (len(s), _partial_string(s, 0))) s = base64.b64decode(s) elif not 'binary' in niform: raise ValueError('Illegal niform %s' % niform) data_1d = np.fromstring(s, dtype=tp) debug('NIML', 'data vector has %d elements, reshape to %d x %d = %d', (np.size(data_1d), nrows, ncols, nrows * ncols)) data = np.reshape(data_1d, (nrows, ncols)) return data
def _datastring2rawniml(s, niml): '''Converts data with uniform type to raw NIML''' debug('NIML', 'Raw string to NIML: %d characters', len(s)) tps = niml['vec_typ'] onetype = types.findonetype(tps) if onetype is None or ([onetype] == types.str2codes('string') and len(tps) > 1): return _mixedtypes_datastring2rawniml(s, niml) if [onetype] == types.str2codes('string'): # single string return decode_escape(s.decode()) # do not string2rawniml # numeric, either int or float ncols = niml['vec_num'] nrows = niml['vec_len'] tp = types.code2numpy_type(onetype) niform = niml.get('ni_form', None) if not niform or niform == 'text': data = np.zeros((nrows, ncols), dtype=tp) # allocate space for data convertor = types.code2python_convertor(onetype) # string to type convertor vals = s.split(None) # split by whitespace seperator if len(vals) != ncols * nrows: raise ValueError("unexpected number of elements") for i, val in enumerate(vals): data[i // ncols, i % ncols] = convertor(val) else: dtype = np.dtype(tp) dtype = types.byteorder_from_niform(niform, dtype) if 'base64' in niform: debug('NIML', 'base64, %d chars: %s', (len(s), _partial_string(s, 0))) s = base64.b64decode(s) elif not 'binary' in niform: raise ValueError('Illegal niform %s' % niform) data_1d = np.fromstring(s, dtype=tp) debug('NIML', 'data vector has %d elements, reshape to %d x %d = %d', (np.size(data_1d), nrows, ncols, nrows * ncols)) data = np.reshape(data_1d, (nrows, ncols)) return data