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 を使用すると遅くなります。ただし、マップまたはリスト内包表記を使用してこれを解決できないようです。この関数は、3x3 テンソルを表す 9 つの値のリストに対して実行されることに注意してください。

パフォーマンスを向上させる方法を提案している人はいますか? おそらく、フラット化操作と結果リストの手動インデックス付けですか?

ありがとう!

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 に答える