def __getitem__ (self, key):
import numpy as np
# Coerce key into a tuple of slice objects.
if not isinstance(key,tuple):
if hasattr(key,'__len__'): key = tuple(key)
else: key = (key,)
if len(key) == 1 and hasattr(key[0],'__len__'):
key = tuple(key[0])
if Ellipsis in key:
i = key.index(Ellipsis)
key = key[:i] + (slice(None),)*(self.ndim-len(key)+1) + key[i+1:]
key = key + (slice(None),)*(self.ndim-len(key))
if len(key) > self.ndim:
raise ValueError(("Too many dimensions for slicing."))
final_shape = tuple(len(np.arange(n)[k]) for n,k in zip(self.shape,key) if not isinstance(k,int))
data = np.ma.empty(final_shape, dtype=self.dtype)
outer_ndim = self._record_id.ndim
record_id = self._record_id.__getitem__(key[:outer_ndim])
# Final shape of each record (in case we did any reshaping along ni,nj,nk
# dimensions).
record_shape = self.shape[self._record_id.ndim:]
# Iterate of each record.
for ind in np.ndindex(record_id.shape):
r = int(record_id[ind])
if r >= 0:
data[ind] = self._buffer._fstluk(r)['d'].transpose().reshape(record_shape)[(Ellipsis,)+key[outer_ndim:]]
else:
data.mask = np.ma.getmaskarray(data)
data.mask[ind] = True
return data
评论列表
文章目录