From cb251da8b576b376afcba11eed7a69bf5571c87b Mon Sep 17 00:00:00 2001 From: Jonathan Helmus Date: Sat, 16 Sep 2017 12:09:02 -0500 Subject: [PATCH 1/2] ENH: pyfive.Dataset.dims attribute The dims attribute provide access to dimension labels and scales on HDF5 datasets. --- pyfive/high_level.py | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/pyfive/high_level.py b/pyfive/high_level.py index fbc41344..bc52bf5d 100644 --- a/pyfive/high_level.py +++ b/pyfive/high_level.py @@ -1,6 +1,6 @@ """ High-level classes for reading HDF5 files. """ -from collections import Mapping, deque +from collections import Mapping, deque, Sequence from io import open # Python 2.7 requires for a Buffered Reader import numpy as np @@ -299,7 +299,7 @@ def fillvalue(self): @property def dims(self): """ dims attribute. """ - raise NotImplementedError + return DimensionManager(self) @property def attrs(self): @@ -307,3 +307,39 @@ def attrs(self): if self._attrs is None: self._attrs = self._dataobjects.get_attributes() return self._attrs + + +class DimensionManager(Sequence): + """ Represents a collection of dimensions associated with a dataset. """ + def __init__(self, dset): + ndim = len(dset.shape) + dim_list = [[]]*ndim + if 'DIMENSION_LIST' in dset.attrs: + dim_list = dset.attrs['DIMENSION_LIST'] + dim_labels = [b'']*ndim + if 'DIMENSION_LABELS' in dset.attrs: + dim_labels = dset.attrs['DIMENSION_LABELS'] + self._dims = [ + DimensionProxy(dset.file, label, refs) for + label, refs in zip(dim_labels, dim_list)] + + def __len__(self): + return len(self._dims) + + def __getitem__(self, x): + return self._dims[x] + + +class DimensionProxy(Sequence): + """ Represents a HDF5 "dimension". """ + + def __init__(self, dset_file, label, refs): + self.label = label.decode('utf-8') + self._refs = refs + self._file = dset_file + + def __len__(self): + return len(self._refs) + + def __getitem__(self, x): + return self._file[self._refs[x]] From fe71d7b919a8d13af51e5cca3c92e8569d06313c Mon Sep 17 00:00:00 2001 From: Jonathan Helmus Date: Sat, 16 Sep 2017 12:12:30 -0500 Subject: [PATCH 2/2] TST: unit tests for dim scales and labels --- tests/dim_scales.hdf5 | Bin 0 -> 8524 bytes tests/make_dim_scales.py | 39 ++++++++++++++++++++++++ tests/test_dim_scales.py | 64 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 tests/dim_scales.hdf5 create mode 100644 tests/make_dim_scales.py create mode 100644 tests/test_dim_scales.py diff --git a/tests/dim_scales.hdf5 b/tests/dim_scales.hdf5 new file mode 100644 index 0000000000000000000000000000000000000000..fc775f37fb7fb0343570ea8b26e8b7380e4693f1 GIT binary patch literal 8524 zcmeHMy-piJ5T3Jv9K-~ppajT|E*(V*k}4&RIResQB21AElR$w4BoZ!cD$3+dQse()ify7)c648ls}BqWEno zd7%>UXs=l%F#6T#_ncM&l0TwplTVuctlq|Y920B8KB#r0`5~=E5P14uA+Q{m-phhN z*s9+cJuyEsmbMRf>aUn-NWrOT^vG!AwaP_Ls_@%L#h1!}MpefY1JaR$yb8=MDQ`V7 zoo@0x`@i%ohQw!0Qsl~E3Y|Qc%Q?d#pBSm+gBoi}s<{$H(auq0SS2`5kpG%hc>^72 zA+6n}Qmw2l1~kI6)f8djU5w6~eD8S|1rw*Y&PZ>)Icq+f>8&>nyZ3tQMb>-4ta=utAwc%1Nmy($KsRslk zCnlsyX_fzPXg?W2QIYe%d9by=!?wg4(fLzHsHKEUm8Yy#{)Pu|zM$7V&nJdQp=0QN z$`yzS*3FK>2@ab;t+ zoiQ!E?Ln^}(>jfKC{F3C*m3=i;T&aRID1druvds_X>1umi@?6d++B?CEYg{z(FVsN z_V(jh=R9wU6VZYix@B3QFU~?h6TE{RvDcOA29bo8WoI9AmK6af#EL-0_gc1OiL12p z5)Ki+M7zXM3iOjp(VL(;kGmc(#p`jU9B(FW+(+C&#@*hkZ}H~|r`xN*{I+-ZcMcAB zKOdNK=Pq2fkp1?6^&xfznvLxb>in^uL7l(&k)%PNzr^g_Uf72G`)_IIkpq%yO43sA bgOv4^fk!~%