Python在张量值体数据上嵌套for循环

时间:2013-04-09 15:40:38

标签: python loops nested itk

使用ITK python包装,我正在读取张量值的音量。 在每个张量上我执行如下操作:

image      = reader.Execute()
dimensions = image.GetSize()

for z in range ( 0, dimensions[2] ):
  for y in range ( 0, dimensions[1] ):
    for x in range ( 0, dimensions[0] ):      
      image[x,y,z] = function( image[x,y,z] )

显然,嵌套的for循环使用Python很慢。 但是,我似乎无法使用地图或列表理解来解决此问题。 请注意,该函数在9个值的列表上执行,这些值表示3x3张量。

有人建议如何提高性能? 也许是对结果列表进行扁平化操作和手动索引?

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用itertools.product,但在假设它实际上更快之前我会进行分析:

import itertools

xs = range(0, dimensions[0])
ys = range(0, dimensions[1])
zs = range(0, dimensions[2])

coords = itertools.product(xs, ys, zs)

for v in coords:
    image[v[0], v[1], v[2]] = function(image[v[0], v[1], v[2]])

我的猜测是,遗憾的是,Python中图像像素的任何循环都会非常慢,你需要以某种方式表达你的操作而不使用成像库进行循环。

答案 1 :(得分:0)

经过一些实验,我现在正在使用可读性和速度之间的权衡。 map函数提供了一个简洁的解决方案,尽管它仍然很慢。在某种程度上,我的问题在Numpy: Beginner nditer

中得到了解决

这是我目前的版本:

reader     = sitk.ImageFileReader()
reader.SetFileName ( tensorVolumePath )  

image      = reader.Execute()
dimes      = image.GetSize()
origin     = image.GetOrigin()    

values     = sitk.GetArrayFromImage( image )
valuesFlat = values.reshape(dims[0]*dims[1]*dims[2], 3, 3)  

arrayInv   = np.array(map(np.linalg.inv, valuesFlat))  

imageInv = sitk.GetImageFromArray( valuesFlat.reshape(dims[0], dims[1], dims[2], -1) )
imageInv.SetOrigin(origin)

writer = sitk.ImageFileWriter()
writer.SetFileName ( tensorVolumeInversePath )
writer.Execute ( imageInv );