def _group(self, key): # adapted from `toolz` package. # see license in $PYTRAJHOME/licenses/externals/toolz.txt import collections # d = collections.defaultdict(lambda: self.__class__().append) d = collections.defaultdict(lambda: [].append) for item in self: d[key(item)](item) rv = {} for k, v in iteritems(d): rv[k] = v.__self__ return rv
def __init__(self, dslist=None, copy=False): if dslist: if isinstance(dslist, dict): # {'x': [1, 3, 5], 'y': [4, 7, 8]} for key, values in iteritems(dslist): self.append(DataArray({key: values}), copy=copy) else: for d0 in dslist: # always make a copy # from DataArray(d0) # so we set copy=False here # to avoid copying twice self.append(DataArray(d0), copy=copy)
def groupby(key, seq): # lightly adapted from `toolz` package. # see license in $PYTRAJHOME/licenses/externals/toolz.txt ''' Examples -------- >>> names = ['Alice', 'Bob', 'Charlie', 'Dan', 'Edith', 'Frank'] >>> _ = groupby(len, names) ''' d = defaultdict(lambda: seq.__class__().append) for item in seq: d[key(item)](item) rv = {} for k, v in iteritems(d): rv[k] = v.__self__ return rv
def groupby(key, seq): # lightly adapted from `toolz` package. # see license in $PYTRAJHOME/licenses/externals/toolz.txt ''' Examples -------- >>> names = ['Alice', 'Bob', 'Charlie', 'Dan', 'Edith', 'Frank'] >>> groupby(len, names) {3: ['Bob', 'Dan'], 5: ['Alice', 'Edith', 'Frank'], 7: ['Charlie']} ''' d = defaultdict(lambda: seq.__class__().append) for item in seq: d[key(item)](item) rv = {} for k, v in iteritems(d): rv[k] = v.__self__ return rv
def concat_dict(iterables): """concat dict Examples -------- >>> dict_0 = {'x' : [1, 2, 3,]} >>> dict_1 = {'x' : [4, 5]} >>> concat_dict((dict_0, dict_1)) OrderedDict([('x', array([1, 2, 3, 4, 5]))]) """ new_dict = OrderedDict() for i, d in enumerate(iterables): if i == 0: # make a copy of first dict new_dict.update(d) else: for k, v in iteritems(new_dict): new_dict[k] = np.concatenate((new_dict[k], d[k])) return new_dict
def dict_to_ndarray(dict_of_array): """convert OrderedDict to numpy array Examples -------- >>> import pytraj as pt >>> traj = pt.load_sample_data('tz2') >>> dslist = pt.multidihedral(traj, dhtypes='phi psi', resrange='2', dtype='dict') >>> list(dslist.keys()) ['phi:2', 'psi:2'] >>> dict_to_ndarray(dslist) array([[-128.72617304, -109.44321317, -130.93278259, ..., -146.70146067, -121.58263643, -112.74485175], [ 150.11249102, 142.52303293, 131.11609265, ..., 123.44883266, 141.18992429, 120.03168126]]) """ if not isinstance(dict_of_array, OrderedDict): raise NotImplementedError("support only OrderedDict") from pytraj.externals.six import iteritems return np.array([v for _, v in iteritems(dict_of_array)])