python: установка значений индексов в каждом срезе массива 3d numpy с соответствующим 2d массивом - PullRequest
0 голосов
/ 13 марта 2020

У меня есть 3d-стек размером 8x512x512, и я хотел бы установить значения для каждого из массивов 8x - 512x512-- на основе двух соответствующих 2d массивов 512x512.

Array1 - это двоичный файл с некоторой желаемой формой, а Array2 имеет значения, которые я хочу проецировать через трехмерный массив. Я хотел бы, чтобы значения из Array2 появлялись на каждом срезе 512x512 в трехмерном массиве, где значения Array1 равны 1. Поэтому, если Array1 - ограничивающий прямоугольник, а Array2 - изображение кошки, лицо которого находится в пределах областей ограничивающего прямоугольника ... Я хочу, чтобы лицо кота проецировалось на каждый из 8х кусочков массива 8x512x512.

Я думаю, что это простая проблема, но я могу думать только о том, что, как я полагаю, является глупым способом сделать это:

Array1 = np.zeros((512,512)); Array1[10:20,40:60]=1
Array2 = np.load(somecatpicture)
Array3d = np.random.rand(8,512,512)

for imnum in range(Array3d.shape[0]):
    tmp = np.copy(Array3d[imnum,...])
    tmp[Array1==1] = Array2[Array1==1]
    Array3d[imnum,...] = tmp

или:

Array1 = np.zeros((512,512)); Array1[10:20,40:60]=1
Array2 = np.load(somecatpicture)
Array3d = np.random.rand(8,512,512)

stack1 = np.array([Array1 for i in range(Array3d.shape[0])])
stack2 = np.array([Array2 for i in range(Array3d.shape[0])])
Array3d[stack1==1] = stack2[stack1==1]

Я предполагаю, что есть какой-то способ сделать это без al oop или понимания списка:

Array3d[:,[Array1==1]]=Array2[Array1==1]

?

1 Ответ

0 голосов
/ 13 марта 2020

Давайте попробуем это на небольшом примере, который мы можем визуализировать

Изображение и маска. mask==1 - это то же самое, что преобразование его в логическое значение:

In [280]: img = np.arange(12).reshape(3,4)*10                                                  
In [281]: mask = np.zeros((3,4),int); mask[1,1:3]=1                                            
In [282]: mask = mask.astype(bool)                                                             
In [283]: mask                                                                                 
Out[283]: 
array([[False, False, False, False],
       [False,  True,  True, False],
       [False, False, False, False]])

Таким образом, выбранная часть изображения:

In [284]: img[mask]                                                                            
Out[284]: array([50, 60])

Определите целевой массив 3d:

In [285]: arr = np.arange(24).reshape(2,3,4)                                                   
In [286]: arr                                                                                  
Out[286]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

применить маску - с индексом [[0],[1]] первого измерения:

In [287]: arr[np.arange(arr.shape[0])[:,None],mask]                                            
Out[287]: 
array([[ 5,  6],
       [17, 18]])

и вставить:

In [288]: arr[np.arange(arr.shape[0])[:,None],mask]=img[mask]                                  
In [289]: arr                                                                                  
Out[289]: 
array([[[ 0,  1,  2,  3],
        [ 4, 50, 60,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 50, 60, 19],
        [20, 21, 22, 23]]])

np.arange(arr.shape[0])[:,None] - ключ к применению вставка для всех блоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...