Набор всех элементов в замаскированной части массива numpy

#python #numpy #set #mask

Вопрос:

Как мне найти набор всех уникальных элементов, которые находятся в маске замаскированного массива numpy?

Например, у меня есть

 seg = np.array([[1,2,3,4]]) mask = np.array([[False, True, False, True]])  

Как мне превратить это в набор {2, 4} ?

Комментарии:

1. В чем дело seg[mask] ?

Ответ №1:

Есть два способа сделать это. Если у вас есть массив типа numpy.ma, который является собственным классом массива с масками numpy, вы можете сгладить массив с масками, затем преобразовать его в список, а затем в набор:

 y = ma.array(seg, mask=1-mask) print(set(y.flatten().tolist()) - {None})  

Который выведет {2, 4}.

Однако, учитывая то, как вы его настроили, маска и сегмент находятся в двух отдельных массивах numpy. Так что вы можете сделать это:

 boundaries = set(seg[np.where(mask)]) print(boundaries)  

Это находит индексы, где маска равна 1, получает элементы seg по этим индексам и создает из них набор.

редактировать: Вы можете просто использовать seg[маску] в соответствии с комментарием hpaulj:

 boundaries = set(seg[mask]) print(boundaries)  

Который выведет {2, 4}.

Комментарии:

1. В этом ответе в качестве вопроса используется другой массив…

2. Хороший улов. Я изменил ответ так, чтобы он соответствовал вопросу.

Ответ №2:

В дополнение к ответу @chenjesu вы также можете получить набор [2 4] вместо массива numpy со следующей функцией:

 def find_unique_elements(seg, mask):  # Find the unique elements in the mask of the masked array.  unique_elements = np.unique(seg[mask])  return unique_elements  

в вашем случае это вернет [2 4] набор.