#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]
набор.