如何在ndim> 2个数组中使用`apply_along_axis`?

时间:2018-12-23 22:46:21

标签: python arrays numpy

我正在尝试对玩具数字数据集图像应用高斯滤波。它以(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

我试图更改轴,但这没有帮助。我还首先通过简单地返回图像/平方值来进行检查。在这些情况下,结果似乎是等效的。但是,应用点积又会产生不同的结果。

# 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参数只接受一维数组。 See...

0 个答案:

没有答案