123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- # 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 a portion of the selection operations.
- """
- import numpy as np
- from .. import h5s
- def read_dtypes(dataset_dtype, names):
- """ Returns a 2-tuple containing:
- 1. Output dataset dtype
- 2. Dtype containing HDF5-appropriate description of destination
- """
- if len(names) == 0: # Not compound, or all fields needed
- format_dtype = dataset_dtype
- elif dataset_dtype.names is None:
- raise ValueError("Field names only allowed for compound types")
- elif any(x not in dataset_dtype.names for x in names):
- raise ValueError("Field does not appear in this type.")
- else:
- format_dtype = np.dtype([(name, dataset_dtype.fields[name][0]) for name in names])
- if len(names) == 1:
- # We don't preserve the field information if only one explicitly selected.
- output_dtype = format_dtype.fields[names[0]][0]
- else:
- output_dtype = format_dtype
- return output_dtype, format_dtype
- def read_selections_scalar(dsid, args):
- """ Returns a 2-tuple containing:
- 1. Output dataset shape
- 2. HDF5 dataspace containing source selection.
- Works for scalar datasets.
- """
- if dsid.shape != ():
- raise RuntimeError("Illegal selection function for non-scalar dataset")
- if args == ():
- # This is a signal that an array scalar should be returned instead
- # of an ndarray with shape ()
- out_shape = None
- elif args == (Ellipsis,):
- out_shape = ()
- else:
- raise ValueError("Illegal slicing argument for scalar dataspace")
- source_space = dsid.get_space()
- source_space.select_all()
- return out_shape, source_space
- class ScalarReadSelection(object):
- """
- Implements slicing for scalar datasets.
- """
- def __init__(self, fspace, args):
- if args == ():
- self.mshape = None
- elif args == (Ellipsis,):
- self.mshape = ()
- else:
- raise ValueError("Illegal slicing argument for scalar dataspace")
- self.mspace = h5s.create(h5s.SCALAR)
- self.fspace = fspace
- def __iter__(self):
- self.mspace.select_all()
- yield self.fspace, self.mspace
- def select_read(fspace, args):
- """ Top-level dispatch function for reading.
- At the moment, only supports reading from scalar datasets.
- """
- if fspace.shape == ():
- return ScalarReadSelection(fspace, args)
- raise NotImplementedError()
|