MetaArray: make it possible to append multiple axis values

Example use case: taking an image stack where each frame has a time value AND a position. Previously we could only append new time values.
This commit is contained in:
Luke Campagnola 2017-09-28 09:09:17 -07:00
parent f627a6a447
commit 2a56435475
1 changed files with 13 additions and 9 deletions

View File

@ -748,7 +748,6 @@ class MetaArray(object):
else:
fd.seek(0)
meta = MetaArray._readMeta(fd)
if not kwargs.get("readAllData", True):
self._data = np.empty(meta['shape'], dtype=meta['type'])
if 'version' in meta:
@ -1031,6 +1030,7 @@ class MetaArray(object):
"""Write this object to a file. The object can be restored by calling MetaArray(file=fileName)
opts:
appendAxis: the name (or index) of the appendable axis. Allows the array to grow.
appendKeys: a list of keys (other than "values") for metadata to append to on the appendable axis.
compression: None, 'gzip' (good compression), 'lzf' (fast compression), etc.
chunks: bool or tuple specifying chunk shape
"""
@ -1096,7 +1096,6 @@ class MetaArray(object):
'chunks': None,
'compression': None
}
## set maximum shape to allow expansion along appendAxis
append = False
@ -1125,14 +1124,19 @@ class MetaArray(object):
data[tuple(sl)] = self.view(np.ndarray)
## add axis values if they are present.
axKeys = ["values"]
axKeys.extend(opts.get("appendKeys", []))
axInfo = f['info'][str(ax)]
if 'values' in axInfo:
v = axInfo['values']
v2 = self._info[ax]['values']
shape = list(v.shape)
shape[0] += v2.shape[0]
v.resize(shape)
v[-v2.shape[0]:] = v2
for key in axKeys:
if key in axInfo:
v = axInfo[key]
v2 = self._info[ax][key]
shape = list(v.shape)
shape[0] += v2.shape[0]
v.resize(shape)
v[-v2.shape[0]:] = v2
else:
raise TypeError('Cannot append to axis info key "%s"; this key is not present in the target file.' % key)
f.close()
else:
f = h5py.File(fileName, 'w')