Самый быстрый способ обрезать трехмерный массив внутри трехмерного массива с помощью Python - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть 3D-массив и список 3D-индексов. Моя цель - выделить небольшой объем 3D определенного размера (3x3x3 или 5x5x5 или любой другой) для каждого индекса (с индексом, лежащим в середине объема).

На данный момент я делаю это: 1) Сгруппировать пять 2D-массивов (с интересующим посередине, следуя указателям). Таким образом, имея массив 5xNxN. 2) Для объема 5x5x5 для каждого 2D-массива (0, N, N; 1, N, N..etc) моего массива 5xNxN я обрезаю массив 5x5 вокруг того же индекса. 3) Сложите эти пять массивов 5x5 2D, чтобы получить мой маленький объем 3D.

Есть ли самый быстрый способ сделать эту работу?

Вот пояснительный код:

arr = np.zeros((7,7,7)) #Just a 3D array
ind = [3, 3, 3] #My index
for el in range(arr.shape[0]):
    if el==ind[0]:
        group = arr[el-2:el+3] #it isolates a 3D volume with arr[ind[0]] in the middle
        volume_3d = []
        for i in group:
            volume_2d = i[ind[1]-2:ind[1]+3, ind[2]-2:ind[2]+3]
            volume_3d.append (volume_2d) #it builds the 3D volume

Спасибо

1 Ответ

0 голосов
/ 10 ноября 2018

Numpy довольно легко поддерживает нарезку следующим образом:

dim = 5
x = dim // 2
i,j,k = ind

volume_3d = arr[i-x:i+(dim-x), j-x:j+(dim-x), k-x:k+(dim-x)].copy()

# Your implementation.
dim = 5
x = dim // 2
arr = np.random.randn(7, 7, 7)
el = ind[0]
group = arr[el-x:el+(dim-x)] 
volume_3d = []
for i in group:
    volume_2d = i[ind[1]-x:ind[1]+(dim-x), ind[2]-x:ind[2]+(dim-x)]
    volume_3d.append (volume_2d)

# Proposed in this post.
i,j,k = ind
volume_3d_2 = arr[i-x:i+(dim-x), j-x:j+(dim-x), k-x:k+(dim-x)]

print(np.array_equal(volume_3d, volume_3d_2))
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...