我有一个具有多个维度(x,y,通道,z,时间步长)的数组。但是,原始数据作为单个堆栈(x,y,通道)存储在TIFF图像中,并带有z *个时间步长帧。
最后,Pillow的Image.getdata()函数返回一个需要重塑的类似于一维数组的对象。
如果数据集太大而无法容纳到内存中,将其读入HDF5的最佳方法是什么?将数组写入HDF5后是否可以对其进行整形或以自动填充数组的方式写入一维数据(即,以最快的速度变化,以y的速度变化最快的y进行写入)更新:类似于numpy.ndarray.flat将是理想的。
到目前为止,这是我尝试过的(img是PIL.Image,dset是h5py数据集):
1)读取单个帧。这种方法太慢了,因为在1000帧中需要300分钟才能占用300MB。大部分时间都花在dset [] =一个调用上。
for i in range(0, img_layers):
img.seek(i)
a = numpy.array(img.getdata(), dtype=dtype) # a.shape = (sx * sz * channels,)
a.resize(sx, sy, channels)
z = i % sz
frame = i // sz
dset[..., z, frame] = a
2)不完整:分块读取。这要快得多(对于相同的数据集为2分钟),但是我只对4D图像(sx,sy,通道,时间步长)起作用,并且需要给z切片附加尺寸:
chunk_bits = 256 * 1000**2 # 256MB
frame_bits = depth_bits[dtype] * sx * sy * channels
chunk_frames = chunk_bits // frame_bits
a = numpy.zeros((sx, sy, channels, chunk_frames), dtype=dtype)
for i in range(0, layers):
img.seek(i)
temp = numpy.array(img.getdata(), dtype=dtype)
temp.resize(sx, sy, channels)
a[..., i % chunk_frames] = temp
if (i + 1) % chunk_frames == 0 or i == (layers - 1):
chunk = i // chunk_frames
dset[..., chunk * chunk_frames : i + 1] = a[..., : i % chunk_frames + 1
选项1是正确的答案。但是,哪个维度变化最快的差异很大:
〜15分钟:
for i in range(0, img_layers):
img.seek(i)
a = numpy.array(img.getdata(), dtype=dtype)
a.resize(sx, sy, channels)
z = i % sz
frame = i // sz
dset[..., z, frame] = a # Majority of time in this call
约3分钟:
for i in range(0, img_layers):
img.seek(i)
a = numpy.array(img.getdata(), dtype=dtype) # Majority of time in this call
a.resize(sx, sy, channels)
z = i % sz
frame = i // sz
dset[frame, z, ...] = a
为了快速读取此数据,变化最快的索引应该是LAST,而不是第一个。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句