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

db2dz4w8  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(91)

我正在尝试将巨大的5D HD 5图像(使用h5 py读取)转换为可以被Napari读取的数组。然而,我只能提取它的3D堆栈(Z,X,Y),所以我必须在通道和时间上进行切换,并将所有4D数组合并组合成5D数组。然而,每个时间点大约需要1分钟,因此使用我当前的代码,每个数据文件可能需要一个多小时。
目前,我正在将每个通道的所有数组追加到一个列表中,将列表转换为数组,然后存储在另一个列表中。在遍历所有时间点后,我将列表转换为数组。我尝试先将所有数组追加到一个列表中,然后再转换为数组,我试着堆叠数组,但似乎都很慢。2有什么想法可以更快地加速和/或更快地将多通道图像转换为数组吗?谢谢你,谢谢

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)

sycxhyv7

sycxhyv71#

您正在进行大量的数据操作:1)将数组追加到列表中,2)将列表转换为数组,3)存储到另一个列表中,4)最后将第二个列表转换为数组。我有99%的把握,这会导致性能问题。请改为创建目标image数组(作为一个适当大小的空数组),然后直接读取和加载数据到它。这样更简单,更快。
“我只能提取它的3D堆栈(Z,X,Y)"是什么意思?h5 py数据集可以使用NumPy表示法进行切片,因此切片和堆栈所需的数据应该“相对容易”(如果您了解该模式)。
鉴于你的帖子缺乏细节,我需要更多的信息来写答案。请记录H5文件的模式。或者像@dankal444所说的,提供一个具有类似模式的最小的、可重复的示例。
我试图创建一个示例文件来模仿你的代码,但无法从你的代码中推断出模式。请参阅下面的注解:
这是有道理的:

im = file.get('DataSet')

字符串
它读取名为“DataSet”的H5数据集,并以数组im的形式返回:im的数据类型和形状是什么?
你想用这条线做什么?

res0 = im.get('ResolutionLevel 0')


它是应用了numpy数组的字典.get()语法(无效):
.get()语法继续使用dataautostack1/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')


最后,看起来stack1stack2引用了相同的对象--这是一个拼写错误吗?

相关问题