如何从一维源填充HDF5中的n维数组?

kai

我有一个具有多个维度(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
kai

选项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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

HDF5:创建1维属性

来自分类Dev

HDF5:创建1维属性

来自分类Dev

用Xdmf描述5维hdf5矩阵

来自分类Dev

如何从一维数组制作多维数组?

来自分类Dev

如何将n维数组除以维中的第一个值

来自分类Dev

如何使用Numpy将值从一维数组插入二维数组

来自分类Dev

如何在Javascript中将值从一维数组推送到二维数组?

来自分类Dev

从一维数组中的值开始切片二维数组

来自分类Dev

从一维数组创建二维数组

来自分类Dev

从一维数组创建二维数组

来自分类Dev

如何使用R从一维数组创建网格?

来自分类Dev

如何通过无限一维数组垂直填充数组

来自分类Dev

如何使用一列将数组尺寸从一维更改为二维

来自分类Dev

如何从一维Numpy数组的所有排列中删除所有圆桌排列?

来自分类Dev

如何从一串选项为Javascript中的select标记构建二维数组?

来自分类Dev

如何访问一维数组中的多维?

来自分类Dev

从一维获取二维数组索引

来自分类Dev

用一维数组填充二维数组java

来自分类Dev

如何输入填充未知变量值的一维数组

来自分类Dev

如何从一维 numpy 数组和两个限制数组中获取切片区域的二维数组

来自分类Dev

从一维数组制作矩阵

来自分类Dev

如何准备,填充和探索n维numpy数组?

来自分类Dev

用C ++填充一维数组

来自分类Dev

如何使用形状(N,)的一维数组索引维N的numpy数组

来自分类Dev

如何填充二维数组?

来自分类Dev

如何填充三维数组

来自分类Dev

如何填充二维数组?

来自分类Dev

如何从一维数组创建具有关联子数组的数组?

来自分类Dev

如何从一个二维阵列添加整数,并创建一个新的二维数组

Related 相关文章

热门标签

归档