def _forward_dataset(self, ds): targ = np.copy(ds.targets) mapped = None X = None i,j = ds.shape if self._stack=='v': chunks = np.unique(ds.sa[self._chunks_attr].value) else: chunks = np.unique(ds.fa[self._chunks_attr].value) for ch,chunk in enumerate(chunks): if self._stack == 'v': table = ds[ds.sa[self._chunks_attr].value==chunk,:] if self._stack == 'h': table = ds[:,ds.fa[self._chunks_attr].value==chunk] table = self.center_and_norm_table(table, col_mean=self._subtable_stats[ch]['col_mean'], col_norm=self._subtable_stats[ch]['col_norm'], table_norm = self._subtable_stats[ch]['table_norm'])[0] if self._stack =='v': # Assume features align, use average Q Q_ = None for subtab in np.unique(self.subtable_idx): if Q_ is None: Q_ = self.Q[self.subtable_idx==subtab,:] else: Q_ = Q_ + self.Q[self.subtable_idx==subtab,:] Q_ = Q_ / len(np.unique(self.subtable_idx)) part = Dataset(np.dot(table.samples,Q_)) part.sa = table.sa if self._stack =='h': # Assume same number of features as in X part = Dataset(np.dot(table,self.Q[self.subtable_idx==chunk,:])) part.sa = table.sa part.sa['chunks'] = [chunk]*part.shape[0] if mapped is None: mapped = part.copy() X = table else: mapped.append(part.copy()) X.append(table,'h') mapped.a['X'] = X if self.keep_dims == 'all': self.keep_dims = range(mapped.shape[1]) return mapped[:,self.keep_dims]