Мне нужно рассчитать самый частый элемент в матрице, основанный на соседних значениях и сам. Я нашел функцию generic_filter, которую я использовал для расчета того, что я хотел. Так вот, как я могу сделать это для 2d массиваndimage.generic_function на 3d-массиве
arr = np.array([
[1, 2, 4],
[5, 6, 7],
[2, 4, 4]
])
def most_frequent(arr):
def most_frequent(val):
return Counter(val).most_common(1)[0][0]
footprint = [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
return ndimage.generic_filter(arr, most_frequent, footprint=footprint, mode='constant')
print most_frequent(arr)
Это возвращает меня
[[0 0 0]
[0 4 0]
[0 0 0]]
Игнорировать элементы на краю. Как вы видите, средний элемент равен 4, потому что это самый частый элемент среди соседей и значение.
Большая проблема в том, что мне нужно сделать то же самое для 3d-матрицы. Таким образом, для матрицы, как этот
arr = np.array([
[[1, 1], [2, 2], [4, 4]],
[[5, 5], [6, 6], [7, 7]],
[[2, 2], [4, 4], [4, 4]]
])
Я ожидаю получить [0, 0]
везде и [4, 4]
в середине. Это не с RuntimeError('filter footprint array has incorrect shape.')
. Хуже дело, что у меня есть сомнения, что я могу использовать generic_filter здесь, потому что документы говорят:
CVAL: скаляр, дополнительное значение для заполнения мимо края ввода, если режим «константы».
Так как я могу решить свою проблему?
Имеет ли массив трехмерного ввода только целые числа? – Divakar
Еще один вопрос: вы намереваетесь запускать такой фильтр в скользящем режиме через entir e 3D-массив, который может быть любой длины, а не просто '(3,3,2)', правильно? – Divakar