1

使用 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 张量。

有人对如何提高性能有建议吗?也许是结果列表的展平操作和手动索引?

谢谢!

4

2 回答 2

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 中图像像素上的任何循环都会非常缓慢,您需要使用成像库以某种方式表达您的操作而无需循环。

于 2013-04-09T15:47:19.057 回答
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 );
于 2013-05-06T08:55:05.870 回答