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