基于张量值体积数据的Python嵌套for循环
使用ITK python包装,我正在读取一个张量值的卷。 在每个张量上,我执行如下操作:基于张量值体积数据的Python嵌套for循环,python,loops,nested,itk,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] = f
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] )
显然,使用Python时嵌套for循环的速度很慢。
然而,我似乎无法通过地图或列表理解来解决这个问题。
请注意,该函数在9个值的列表上执行,表示3x3张量
有人对如何提高绩效有什么建议吗?
可能是对结果列表进行展平操作和手动索引
谢谢 您可以使用
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中图像像素上的任何循环都会非常慢,您需要使用图像库以某种方式表达您的操作,而无需使用循环。经过一些实验后,我现在在可读性和速度之间进行权衡。map函数提供了一个简洁的解决方案,尽管它仍然相当缓慢。我的问题在以下部分得到了解决: 以下是我目前的版本:
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 );
谢谢你的快速回复。用挂钟时间进行的快速粗略测试表明,它的速度大约是原来的两倍。这是一个很好的改进,但我希望有更多的性能提升,因为我正在处理相当大的容量(比如128立方)。仍然想知道Python中是否有可靠的方法,或者我们是否应该使用C来解决这些问题。