使用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张量。
有人建议如何提高性能? 也许是对结果列表进行扁平化操作和手动索引?
谢谢!
答案 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 );