Выберите значение на основе размера в массиве 3D numpy - PullRequest
0 голосов
/ 03 мая 2020

У меня есть несколько масок двоичной сегментации. В сочетании они приводят к 3D-массиву. Если вы суммируете пиксель в 3-м измерении, он должен добавить до 1, то есть пиксель должен иметь только один 1 во всем 3-м измерении:

[[0, 0],
 [1, 0]],

[[1, 1],
 [0, 1]]

К сожалению, это условие не задано для мой трехмерный массив:

[[0, 0],
 [1, 1]],

[[1, 0],
 [1, 0]],

[[1, 1],
 [1, 0]]

Как видно, значение на 2,1 одинаково во всех трех каналах.

Я бы хотел установить значение в нижних каналах на 0, если в существует более высокий канал 1. Как я могу добиться, чтобы массив во втором примере приводил к этому:

[[0, 0],
 [0, 1]],

[[0, 0],
 [0, 0]],

[[1, 1],
 [1, 0]]

1 Ответ

0 голосов
/ 03 мая 2020

Это довольно просто, используя расширенную индексацию Numpy :

import numpy as np

img = np.array([[[0, 0],
                 [1, 1]],
                [[1, 0],
                 [1, 0]],
                [[1, 1],
                 [1, 0]]])

print(img)

print(np.sum(img, axis=2))

# check for ones in the first position in the third axis  
# and get a mask for boolean indexing  
mask = img[:, :, 0] == 1

print(mask)
img_2 = img.copy()

# apply the mask to the second element in the third axis
# and set the values to zero there IF there was a one
# in the other place: when the boolean mask is True
img_2[:,:,1][mask] = 0 

print(img_2)

print(np.sum(img_2, axis=2))
...