Как использовать `apply_along_axis` с ndim> 2 массивами? - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь применить гауссовую фильтрацию к изображениям набора игрушечных цифр.Хранит изображения в массиве (1797, 8, 8).По отдельности я могу заставить его работать, но когда я пытаюсь применить его для всего изображения, установленного с apply_along_axis, что-то идет не так.

Вот основной пример:

from sklearn.datasets import load_digits
from scipy.ndimage.filters import gaussian_filter
images = load_digits().images

# Filter individually
individual = gaussian_filter(images[0], sigma=1, order=0)

# Use `apply_along_axis`
transformed = np.apply_along_axis(
    func1d=lambda x: gaussian_filter(x, sigma=1, order=0),
    axis=2,
    arr=images
)

# They produce different arrays
(transformed[0] != individual).all()
Out: True

Iпопытался изменить ось, но это не помогло.Я также проверил, во-первых, просто возвращая значения изображения / квадрата.В этих случаях результаты кажутся эквивалентными.Однако применение точечного продукта снова приводит к другим результатам.

# Squared values
transformed = np.apply_along_axis(
    func1d=lambda x: x ** 2,
    axis=2,
    arr=images
)

# They produce the same arrays
(transformed[0] == images[0] ** 2).all()
Out: True

# Dot product
transformed = np.apply_along_axis(
    func1d=lambda x: np.dot(x, x),
    axis=2,
    arr=images
)

individual = np.dot(images[0], images[0])

# They produce different arrays
(transformed[0] != individual).all()
Out: True

Я уверен, что неправильно понимаю работу этих функций.Что я делаю не так?

Обновление: Как указал @hpaulj в комментариях, параметр func1d в apply_along_axis принимает только 1d массивы. См ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...