Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于张量值体积数据的Python嵌套for循环_Python_Loops_Nested_Itk - Fatal编程技术网

基于张量值体积数据的Python嵌套for循环

基于张量值体积数据的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

使用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] )
显然,使用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来解决这些问题。