Код: Выделить всё
(N,N,6); и двумерную маску логического массиваКод: Выделить всё
(N,N). Я хотел бы найти все уникальные одномерные подмассивы (длина = 6, вдоль оси = 2) XЭто кажется (относительно) простым, но у меня есть дополнительная сложность, заключающаяся в том, что повторяющиеся элементы X, которые должны быть неуникальными, могут быть неуникальными. различаются из-за причин решения с плавающей запятой/числового решения, поэтому мне нужно округлить значения в X перед сравнением. Однако для моих окончательных результатов мне нужны уникальные значения полной точности, поэтому я не могу просто использовать необработанный вывод функции типа np.unique, примененной к округленным значениям, без дополнительной обработки.
С этой целью я решил найти все индексы уникальных массивов в X (они мне также нужны по другим причинам). То есть мне нужны 2D-пары индексов, соответствующие первым двум измерениям X, где расположены одномерные массивы с уникальной+маской полной точности.
Эти спецификации вместе, кажется, не очень хорошо сочетаются с опциями, которые я сейчас могу найти в numpy. Мне потребовалось несколько попыток, чтобы найти что-то, что сработало.
Попытка №1
Моя первоначальная идея была примерно такой:
Код: Выделить всё
X_unique, unique_idx = np.unique(
X[mask].round(decimals=8),
axis=0,
return_index=True
)
Код: Выделить всё
(,6)Код: Выделить всё
(,)Попытка № 2
Затем я попытался найти способ замаскировать X, сохранив при этом исходные формы, но понял, что что-то вроде следующего не сработает в любом случае:
Код: Выделить всё
X_unique, unique_idx = np.unique(
hypothetical_X_masked_but_still_3D.round(decimals=8),
axis=,
return_index=True
)
Попытка № 3
Далее я попытался сгладить первые два измерения, но вместо того, чтобы опускать элементы, не входящие в маску, я заменил их на Sentinel np.nan, чтобы позже я мог восстановить сплющенный массив в его исходную форму:
Код: Выделить всё
X_masked = np.where(mask[...,None], X, np.nan).reshape(N*N,6)
X_unique, unique_idx = np.unique(
X_masked.round(decimals=8),
axis=0,
equal_nan=True,
return_index=True
)
MRE:
Код: Выделить всё
nans = np.full((6), np.nan)
print(nans == nans) # > [False False False False False False]
print(np.all(nans == nans)) # > False
В любом случае, ошибка или нет, мне пришлось найти какое-то другое значение для замены дозорного значения. Я не мог использовать нечисловой заполнитель, например строку или ..., потому что мое фактическое приложение требует округления значений X перед проверкой на уникальность (из-за проблем с числовой точностью). Я также не мог использовать мнимую часть комплексных чисел в качестве флага, поскольку мой фактический массив X тоже сложный.
В конце концов я нашел своего рода решение, но оно сложнее, чем мне хотелось бы. Возможно, у кого-то есть лучший способ сделать это.
Подробнее здесь: https://stackoverflow.com/questions/798 ... -with-nump
Мобильная версия