def dtype_from_list(space, w_lst, simple): lst_w = space.listview(w_lst) fields = {} offset = 0 names = [] for i in range(len(lst_w)): w_elem = lst_w[i] if simple: subdtype = descr__new__(space, space.gettypefor(W_Dtype), w_elem) fldname = 'f%d' % i else: w_shape = space.newtuple([]) if space.len_w(w_elem) == 3: w_fldname, w_flddesc, w_shape = space.fixedview(w_elem) if not support.issequence_w(space, w_shape): w_shape = space.newtuple([w_shape]) else: w_fldname, w_flddesc = space.fixedview(w_elem, 2) subdtype = descr__new__(space, space.gettypefor(W_Dtype), w_flddesc, w_shape=w_shape) fldname = space.str_w(w_fldname) if fldname == '': fldname = 'f%d' % i if fldname in fields: raise oefmt(space.w_ValueError, "two fields with the same name") assert isinstance(subdtype, W_Dtype) fields[fldname] = (offset, subdtype) offset += subdtype.elsize names.append(fldname) return W_Dtype(types.RecordType(), NPY.VOID, NPY.VOIDLTR, NPY.VOIDLTR, space.gettypefor(boxes.W_VoidBox), names=names, fields=fields, elsize=offset)
def descr_setstate(self, space, w_data): if self.fields is None: # if builtin dtype return space.w_None version = space.int_w(space.getitem(w_data, space.wrap(0))) if version != 3: raise oefmt(space.w_ValueError, "can't handle version %d of numpy.dtype pickle", version) endian = space.str_w(space.getitem(w_data, space.wrap(1))) if endian == NPY.NATBYTE: endian = NPY.NATIVE w_subarray = space.getitem(w_data, space.wrap(2)) w_names = space.getitem(w_data, space.wrap(3)) w_fields = space.getitem(w_data, space.wrap(4)) size = space.int_w(space.getitem(w_data, space.wrap(5))) alignment = space.int_w(space.getitem(w_data, space.wrap(6))) if (w_names == space.w_None) != (w_fields == space.w_None): raise oefmt(space.w_ValueError, "inconsistent fields and names") self.byteorder = endian self.shape = [] self.subdtype = None self.base = self if w_subarray != space.w_None: if not space.isinstance_w(w_subarray, space.w_tuple) or \ space.len_w(w_subarray) != 2: raise oefmt(space.w_ValueError, "incorrect subarray in __setstate__") subdtype, w_shape = space.fixedview(w_subarray) assert isinstance(subdtype, W_Dtype) if not support.issequence_w(space, w_shape): self.shape = [space.int_w(w_shape)] else: self.shape = [space.int_w(w_s) for w_s in space.fixedview(w_shape)] self.subdtype = subdtype self.base = subdtype.base if w_names != space.w_None: self.names = [] self.fields = {} for w_name in space.fixedview(w_names): name = space.str_w(w_name) value = space.getitem(w_fields, w_name) dtype = space.getitem(value, space.wrap(0)) assert isinstance(dtype, W_Dtype) offset = space.int_w(space.getitem(value, space.wrap(1))) self.names.append(name) self.fields[name] = offset, dtype self.itemtype = types.RecordType() if self.is_flexible(): self.elsize = size self.alignment = alignment
def find_shape_and_elems(space, w_iterable, dtype): isstr = space.isinstance_w(w_iterable, space.w_str) if not support.issequence_w(space, w_iterable) or isstr: if dtype is None or dtype.char != NPY.CHARLTR: return [], [w_iterable] is_rec_type = dtype is not None and dtype.is_record() if is_rec_type and is_single_elem(space, w_iterable, is_rec_type): return [], [w_iterable] if isinstance(w_iterable, W_NDimArray) and w_iterable.is_scalar(): return [], [w_iterable] return _find_shape_and_elems(space, w_iterable, is_rec_type)
def is_scalar_like(space, w_obj, dtype): isstr = space.isinstance_w(w_obj, space.w_bytes) if not support.issequence_w(space, w_obj) or isstr: if dtype is None or dtype.char != NPY.CHARLTR: return True is_rec_type = dtype is not None and dtype.is_record() if is_rec_type and is_single_elem(space, w_obj, is_rec_type): return True if isinstance(w_obj, W_NDimArray) and w_obj.is_scalar(): return True return False
def is_scalar_like(space, w_obj, dtype): isstr = space.isinstance_w(w_obj, space.w_str) if not support.issequence_w(space, w_obj) or isstr: if dtype is None or dtype.char != NPY.CHARLTR: return True is_rec_type = dtype is not None and dtype.is_record() if is_rec_type and is_single_elem(space, w_obj, is_rec_type): return True if isinstance(w_obj, W_NDimArray) and w_obj.is_scalar(): return True return False
def descr_setstate(self, space, w_data): if self.fields is None: # if builtin dtype return space.w_None version = space.int_w(space.getitem(w_data, space.wrap(0))) if version != 3: raise oefmt(space.w_ValueError, "can't handle version %d of numpy.dtype pickle", version) endian = space.str_w(space.getitem(w_data, space.wrap(1))) if endian == NPY.NATBYTE: endian = NPY.NATIVE w_subarray = space.getitem(w_data, space.wrap(2)) w_names = space.getitem(w_data, space.wrap(3)) w_fields = space.getitem(w_data, space.wrap(4)) size = space.int_w(space.getitem(w_data, space.wrap(5))) alignment = space.int_w(space.getitem(w_data, space.wrap(6))) if (w_names == space.w_None) != (w_fields == space.w_None): raise oefmt( space.w_ValueError, "inconsistent fields and names in Numpy dtype unpickling") self.byteorder = endian self.shape = [] self.subdtype = None self.base = self if w_subarray != space.w_None: if not space.isinstance_w(w_subarray, space.w_tuple) or \ space.len_w(w_subarray) != 2: raise oefmt(space.w_ValueError, "incorrect subarray in __setstate__") subdtype, w_shape = space.fixedview(w_subarray) assert isinstance(subdtype, W_Dtype) if not support.issequence_w(space, w_shape): self.shape = [space.int_w(w_shape)] else: self.shape = [ space.int_w(w_s) for w_s in space.fixedview(w_shape) ] self.subdtype = subdtype self.base = subdtype.base if w_names != space.w_None: self.names = [] self.fields = {} for w_name in space.fixedview(w_names): name = space.str_w(w_name) value = space.getitem(w_fields, w_name) dtype = space.getitem(value, space.wrap(0)) assert isinstance(dtype, W_Dtype) offset = space.int_w(space.getitem(value, space.wrap(1))) self.names.append(name) self.fields[name] = offset, dtype self.itemtype = types.RecordType(space) if self.is_flexible(): self.elsize = size self.alignment = alignment