def _deserialize_numpy_matrix(data): if data[1] != '|O': assert data[0].dtype == np.uint8 return np.matrix(data[0].view(descr_to_dtype(data[1])), copy=False) else: return np.matrix(data[0], dtype=np.dtype(data[1]), copy=False)
def descr_to_dtype(descr): ''' descr may be stored as dtype.descr, which is a list of (name, format, [shape]) tuples where format may be a str or a tuple. Offsets are not explicitly saved, rather empty fields with name, format == '', '|Vn' are added as padding. This function reverses the process, eliminating the empty padding fields. ''' if isinstance(descr, str): # No padding removal needed return np.dtype(descr) elif isinstance(descr, tuple): # subtype, will always have a shape descr[1] dt = descr_to_dtype(descr[0]) return np.dtype((dt, descr[1])) fields = [] offset = 0 for field in descr: if len(field) == 2: name, descr_str = field dt = descr_to_dtype(descr_str) else: name, descr_str, shape = field dt = np.dtype((descr_to_dtype(descr_str), shape)) # Ignore padding bytes, which will be void bytes with '' as name # Once support for blank names is removed, only "if name == ''" needed) is_pad = (name == '' and dt.type is np.void and dt.names is None) if not is_pad: fields.append((name, dt, offset)) offset += dt.itemsize names, formats, offsets = zip(*fields) # names may be (title, names) tuples nametups = (n if isinstance(n, tuple) else (None, n) for n in names) titles, names = zip(*nametups) return np.dtype({ 'names': names, 'formats': formats, 'titles': titles, 'offsets': offsets, 'itemsize': offset })
def _deserialize_numpy_array_list(data): if data[1] != '|O': assert data[0].dtype == np.uint8 return data[0].view(descr_to_dtype(data[1])) else: return np.array(data[0], dtype=np.dtype(data[1]))
def test_descr_to_dtype(dt): dt1 = format.descr_to_dtype(dt.descr) assert_equal_(dt1, dt) arr1 = np.zeros(3, dt) arr2 = roundtrip(arr1) assert_array_equal(arr1, arr2)