Python вложенный в цикл для тензорных данных объема

Используя оболочку 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.

У кого-нибудь есть предложения, как повысить производительность? Возможно уплощение операции и ручная индексация результирующего списка?

Спасибо!

2 ответа

Решение

После некоторых экспериментов я сейчас использую компромисс между удобочитаемостью и скоростью. Функция map обеспечивает аккуратное решение, хотя все еще довольно медленная. Частично, мой вопрос был адресован в: Numpy: начинающий 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 );

Ты можешь использовать 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 будет невероятно медленным, и вам нужно как-то выразить свою работу без циклов, используя библиотеку изображений.

Другие вопросы по тегам