def apply(self, func, *args, recurse=False, **kwargs): """ apply function to all channels of the link """ outchildren = {} for cID, child in self.children.items(): logging.info(self.name + ' ' + cID) mattrs = Attributes.merged([self, child]) if recurse is True: outchild = child.apply(func, mattrs, *args, **kwargs) else: outchild = func(child, mattrs, *args, **kwargs) if outchild is not None: outchildren[cID] = outchild return self._new(outchildren, self.name, self.attrs, self.handles)
def __getitem__(self, key): if isinstance(key, (cb.Array, Node)) and key.dtype == bool: return self.mask(~key) if isinstance(key, tuple): if len(key) == 1: return self[key[0]] elif key[0] is Ellipsis: if self.level == len(key) - 1: return self[key[1:]] elif self.level >= len(key): return self[(slice(None),) + key] elif key[0] == slice(None): new = type(self)(name=self.name, attrs=self.attrs) for cID, child in self.children.items(): try: grandchild = child[key[1:]] except KeyError: continue else: if not hasattr(grandchild, 'keys'): grandchild.attrs = Attributes.merged([grandchild, child]) new.children[cID] = grandchild return new elif isinstance(key[0], list): newchildren = OrderedDict((k, v[key[1:]]) for k, v in self.children.items() if k in key[0]) return self._new(newchildren, self.name, self.attrs, self.handles) else: new = self.children[key[0]][key[1:]] return new elif isinstance(key, list): newchildren = OrderedDict((k, v) for k, v in self.children.items() if k in key) return self._new(newchildren, self.name, self.attrs, self.handles) else: new = self.children[key] #new.attrs = Attributes.merged([new, self]) return new
def merged(cls, datlist, xdim=None, **kwargs): """ concatenate sequence of station level containers into one container """ if not datlist: return cls() datlist = com.prep_merger(datlist) dat0 = next(iter(datlist.values())) if len(datlist) <= 1: return dat0 dd = com.defaultdict(OrderedDict) handles = set() for i, idat in datlist.items(): if not (hasattr(idat, 'degree') and idat.degree == cls.degree): continue for cID, child in idat.children.items(): dd[cID][i] = child handles |= idat.handles for i, idat in datlist.items(): if hasattr(idat, 'degree') and idat.degree == cls.degree: continue cID = idat.name dd[cID][i] = idat handles |= idat.handles if xdim is None: attrs = Attributes.merged(datlist) else: attrs, xdim = cb.merge_attrs(datlist, xdim) cdat = cls(name=dat0.name, attrs=attrs) cdat._sub = dat0._sub for cID in dd.keys(): cdat.children[cID] = cdat._sub.merged(dd[cID], xdim=xdim, **kwargs) return cdat