加速将巨大的4D数组转换为5D数组(转换5D多维图像)

问题描述 投票:0回答:1

我正在尝试将巨大的 5D HD5 图像(使用 h5py 读取)转换为 Napari 可以读取的数组。但是,我只能提取它的 3D 堆栈(Z、X、Y),因此我必须迭代通道和时间,并将所有 4D 数组组合成 5D 数组。但是,每个时间点大约需要 1 分钟,因此使用我当前的代码,每个数据文件可能需要一个多小时。

目前,我将每个通道的所有数组附加到一个列表中,将列表转换为数组,然后存储在另一个列表中。检查完所有时间点后,我将列表转换为数组。我尝试先将所有内容附加到列表中,然后转换为数组,尝试一边堆叠数组,但似乎都非常慢。关于如何加快速度和/或更快地将多通道图像转换为数组有什么想法吗?谢谢!

combined_list = []
for i in timepoints:
  im = file.get('DataSet')
  res0 = im.get('ResolutionLevel 0')
  data = res0.get('TimePoint '+ str(i))
  auto = data.get('Channel 0')
  stack1 = auto.get('Data')
  auto = data.get('Channel 0')
  stack2 = auto.get('Data')

  combined_stack = np.asarray([stack1,stack2])
  combined_list.append(combined_stack)
image = np.asarray(combined_list)

供参考,图像约为 (60,3,48, 2048, 5888) (TCZYX)

python arrays numpy performance h5py
1个回答
0
投票

您正在进行大量数据操作:1)将数组附加到列表中,2)将列表转换为数组,3)存储在另一个列表中,4)最后将第二个列表转换为数组。我 99% 确信这会导致性能问题。相反,创建目标

image
数组(作为适当大小的空数组),然后直接读取数据并将数据加载到其中。如此简单快捷。

“我只能提取它的 3D 堆栈 (Z,X,Y)”是什么意思? h5py 数据集可以使用 NumPy 表示法进行切片,因此切片和堆叠您想要的数据应该“相对容易”(如果您了解架构)。

鉴于您的帖子中缺乏详细信息,我需要更多信息来撰写答案。请记录 H5 文件架构。或者正如 @dankal444 所说,提供一个具有类似模式的最小的、可重现的示例。

我尝试创建一个示例文件来模仿您的文件,但无法从您的代码中推断出架构。请参阅下面的评论:

这是有道理的:

im = file.get('DataSet')
它读取名为“DataSet”的 H5 数据集并以数组形式返回

im

im
的dtype和形状是什么?

你想用这条线做什么?

res0 = im.get('ResolutionLevel 0')
它是字典

.get()

语法应用了numpy数组(这是无效的):

.get()

语法继续为
data
auto
stack1/stack2

data = res0.get('TimePoint '+ str(i)) auto = data.get('Channel 0') stack1 = auto.get('Data') auto = data.get('Channel 0') stack2 = auto.get('Data')
最后,看起来 

stack1

stack2
 引用了相同的对象 - 这是拼写错误吗?

© www.soinside.com 2019 - 2024. All rights reserved.