Изменение формы массива numpy

То, что я пытаюсь сделать, это взять массив с множеством цифр, представляющий данные трехмерного изображения, и вычислить матрицу hessian для каждого вокселя. Мой вход представляет собой матрицу формы (Z, X, Y), и я могу легко взять срез вдоль z и получить одно оригинальное изображение.

gx, gy, gz = np.gradient(imgs)

gxx, gxy, gxz = np.gradient(gx)
gyx, gyy, gyz = np.gradient(gy)
gzx, gzy, gzz = np.gradient(gz)

И я могу получить доступ к hessian для отдельного voxel следующим образом:

x = 100
y = 100
z = 63

H = [[gxx[z][x][y], gxy[z][x][y], gxz[z][x][y]],
     [gyx[z][x][y], gyy[z][x][y], gyz[z][x][y]],
     [gzx[z][x][y], gzy[z][x][y], gzz[z][x][y]]]

Но это громоздко, и я не могу легко срезать данные.

Я пробовал использовать reshape следующим образом

H = H.reshape(Z, X, Y, 3, 3) 

Но когда я проверю это, извлекая hessian для определенного voxel, значение, возвращаемое из измененного массива, полностью отличается от исходного массива.

Я думаю, что могу как-то использовать zip, но я смог найти это только для составления списков кортежей.

  • Бонус : если есть более быстрый способ выполнить это, пожалуйста, дайте мне знать, мне, по сути, нужно вычислить три собственных значения матрицы hessian для каждого воксела в трехмерном наборе данных. Вычисление значений hessian очень быстро, но нахождение собственных значений для одного фрагмента 2D-изображения занимает около 20 секунд. Существуют ли какие-либо графические процессоры или ускорители ускоренного потока для обработки изображений?

Всего 1 ответ


Мы можем использовать понимание списка, чтобы получить hessians -

H_all = np.array([np.gradient(i) for i in np.gradient(imgs)]).transpose(2,3,4,0,1)

Чтобы дать ему несколько объяснений: [np.gradient(i) for i in np.gradient(imgs)] проходит через два уровня выходов из np.gradient вызовов, в результате чего тензор (3 x 3) в внешние две оси. Нам нужны эти два в качестве последних двух осей в конечном выходе. Итак, мы подталкиваем их в конце с транспозицией.

Таким образом, H_all содержит все hessians и, следовательно, мы можем извлечь наш конкретный hessian, заданный x,y,z , так же -

x = 100
y = 100
z = 63
H = H_all[z,y,x]