Spaces:
Sleeping
Sleeping
| # This file is part of h5py, a Python interface to the HDF5 library. | |
| # | |
| # http://www.h5py.org | |
| # | |
| # Copyright 2008-2013 Andrew Collette and contributors | |
| # | |
| # License: Standard 3-clause BSD; see "license.txt" for full license terms | |
| # and contributor agreement. | |
| """ | |
| Implements support for HDF5 dimension scales. | |
| """ | |
| import warnings | |
| from .. import h5ds | |
| from ..h5py_warnings import H5pyDeprecationWarning | |
| from . import base | |
| from .base import phil, with_phil | |
| from .dataset import Dataset | |
| class DimensionProxy(base.CommonStateObject): | |
| """ | |
| Represents an HDF5 "dimension". | |
| """ | |
| def label(self): | |
| """ Get or set the dimension scale label """ | |
| return self._d(h5ds.get_label(self._id, self._dimension)) | |
| def label(self, val): | |
| # pylint: disable=missing-docstring | |
| h5ds.set_label(self._id, self._dimension, self._e(val)) | |
| def __init__(self, id_, dimension): | |
| self._id = id_ | |
| self._dimension = dimension | |
| def __hash__(self): | |
| return hash((type(self), self._id, self._dimension)) | |
| def __eq__(self, other): | |
| return hash(self) == hash(other) | |
| def __iter__(self): | |
| yield from self.keys() | |
| def __len__(self): | |
| return h5ds.get_num_scales(self._id, self._dimension) | |
| def __getitem__(self, item): | |
| if isinstance(item, int): | |
| scales = [] | |
| h5ds.iterate(self._id, self._dimension, scales.append, 0) | |
| return Dataset(scales[item]) | |
| else: | |
| def f(dsid): | |
| """ Iterate over scales to find a matching name """ | |
| if h5ds.get_scale_name(dsid) == self._e(item): | |
| return dsid | |
| res = h5ds.iterate(self._id, self._dimension, f, 0) | |
| if res is None: | |
| raise KeyError(item) | |
| return Dataset(res) | |
| def attach_scale(self, dset): | |
| """ Attach a scale to this dimension. | |
| Provide the Dataset of the scale you would like to attach. | |
| """ | |
| with phil: | |
| h5ds.attach_scale(self._id, dset.id, self._dimension) | |
| def detach_scale(self, dset): | |
| """ Remove a scale from this dimension. | |
| Provide the Dataset of the scale you would like to remove. | |
| """ | |
| with phil: | |
| h5ds.detach_scale(self._id, dset.id, self._dimension) | |
| def items(self): | |
| """ Get a list of (name, Dataset) pairs with all scales on this | |
| dimension. | |
| """ | |
| with phil: | |
| scales = [] | |
| # H5DSiterate raises an error if there are no dimension scales, | |
| # rather than iterating 0 times. See #483. | |
| if len(self) > 0: | |
| h5ds.iterate(self._id, self._dimension, scales.append, 0) | |
| return [ | |
| (self._d(h5ds.get_scale_name(x)), Dataset(x)) | |
| for x in scales | |
| ] | |
| def keys(self): | |
| """ Get a list of names for the scales on this dimension. """ | |
| with phil: | |
| return [key for (key, _) in self.items()] | |
| def values(self): | |
| """ Get a list of Dataset for scales on this dimension. """ | |
| with phil: | |
| return [val for (_, val) in self.items()] | |
| def __repr__(self): | |
| if not self._id: | |
| return "<Dimension of closed HDF5 dataset>" | |
| return ('<"%s" dimension %d of HDF5 dataset at %s>' | |
| % (self.label, self._dimension, id(self._id))) | |
| class DimensionManager(base.CommonStateObject): | |
| """ | |
| Represents a collection of dimension associated with a dataset. | |
| Like AttributeManager, an instance of this class is returned when | |
| accessing the ".dims" property on a Dataset. | |
| """ | |
| def __init__(self, parent): | |
| """ Private constructor. | |
| """ | |
| self._id = parent.id | |
| def __getitem__(self, index): | |
| """ Return a Dimension object | |
| """ | |
| if index > len(self) - 1: | |
| raise IndexError('Index out of range') | |
| return DimensionProxy(self._id, index) | |
| def __len__(self): | |
| """ Number of dimensions associated with the dataset. """ | |
| return self._id.rank | |
| def __iter__(self): | |
| """ Iterate over the dimensions. """ | |
| for i in range(len(self)): | |
| yield self[i] | |
| def __repr__(self): | |
| if not self._id: | |
| return "<Dimensions of closed HDF5 dataset>" | |
| return "<Dimensions of HDF5 object at %s>" % id(self._id) | |
| def create_scale(self, dset, name=''): | |
| """ Create a new dimension, from an initial scale. | |
| Provide the dataset and a name for the scale. | |
| """ | |
| warnings.warn("other_ds.dims.create_scale(ds, name) is deprecated. " | |
| "Use ds.make_scale(name) instead.", | |
| H5pyDeprecationWarning, stacklevel=2, | |
| ) | |
| dset.make_scale(name) | |