def _handle_slice(self, idx):
idx = np.index_exp[idx]
frames, dims = None, None
if isinstance(idx, (tuple, list)):
if len(idx) == 1:
frames, dims = idx[0], slice(None, None, None)
if len(idx) == 2:
frames, dims = idx[0], idx[1]
if len(idx) > 2:
raise IndexError("Slice was more than two-dimensional, not supported.")
cumsum = np.cumsum(self._source.trajectory_lengths())
frames = self._get_indices(frames, cumsum[-1])
dims = self._get_indices(dims, self._source.ndim)
nframes = len(frames)
ndims = len(dims)
frames_order = frames.argsort().argsort()
frames_sorted = np.sort(frames)
from chainsaw.clustering import UniformTimeClustering
ra_stride = np.array([UniformTimeClustering._idx_to_traj_idx(x, cumsum) for x in frames_sorted])
data = np.empty((nframes, ndims), dtype=self._source.output_type())
offset = 0
for X in self._source.iterator(stride=ra_stride, lag=0, chunk=0, return_trajindex=False):
L = len(X)
data[offset:offset + L, :] = X[:, dims]
offset += L
return data[frames_order]
评论列表
文章目录