geometric_transform#
- scipy.ndimage.geometric_transform(input, mapping, output_shape=None, output=None, order=3, mode='constant', cval=0.0, prefilter=True, extra_arguments=(), extra_keywords=None)[源码]#
应用任意几何变换。
给定的映射函数用于为输出中的每个点找到输入中的对应坐标。输入在该坐标处的值通过指定阶数的样条插值确定。
- 参数:
- inputarray_like
输入数组。
- mapping{可调用对象, scipy.LowLevelCallable}
一个可调用对象,它接受一个长度等于输出数组秩(rank)的元组,并返回一个长度等于输入数组秩的元组,代表相应的输入坐标。
- output_shape整数元组,可选
形状元组。
- outputarray or dtype, optional
放置输出的数组,或返回数组的数据类型。默认情况下,将创建一个与输入具有相同数据类型的数组。
- orderint, optional
样条插值的阶数,默认为 3。阶数必须在 0-5 的范围内。
- mode{‘reflect’, ‘grid-mirror’, ‘constant’, ‘grid-constant’, ‘nearest’, ‘mirror’, ‘grid-wrap’, ‘wrap’}, optional
mode参数决定了输入数组如何在边界之外进行扩展。默认为 ‘constant’。每个有效值的行为如下(请参阅额外的图和有关 边界模式 的详细信息)。- 'reflect' (d c b a | a b c d | d c b a)
输入通过最后像素的边缘反射进行扩展。此模式有时也称为半样本对称。
- ‘grid-mirror’
这是 ‘reflect’ 的同义词。
- 'constant' (k k k k | a b c d | k k k k)
输入通过用由
cval参数定义的相同常数值填充所有边界之外的值来扩展。在输入边界之外不执行插值。- ‘grid-constant’ (k k k k | a b c d | k k k k)
输入通过用由
cval参数定义的相同常数值填充所有边界之外的值来扩展。插值也发生在输入范围之外的样本上。- 'nearest' (a a a a | a b c d | d d d d)
输入通过复制最后像素进行扩展。
- 'mirror' (d c b | a b c d | c b a)
输入通过最后像素的中心反射进行扩展。此模式有时也称为全样本对称。
- ‘grid-wrap’ (a b c d | a b c d | a b c d)
输入通过环绕到对边进行扩展。
- ‘wrap’ (b c d b c | a b c d | b c a b c)
输入通过环绕到相反的边缘来扩展,但方式是使最后一个点和初始点完全重叠。在这种情况下,在重叠点处选择哪个样本并未明确定义。
对于上面说明的示例,边缘值
a和d重叠,而内部模式b c重复。该示例展示了一种可能的输出,而b c a b c | a b c d | b c d b c是另一种,因为在每个重叠点处都可能出现a或d。
- cval标量,可选
如果 mode 为 'constant',则用于填充输入超出边缘的值。默认值为 0.0。
- prefilterbool, optional
确定在插值前是否使用
spline_filter对输入数组进行预过滤。默认为 True,如果order > 1,这将创建一个临时的 float64 过滤值数组。如果将其设置为 False,当order > 1时,输出会稍微模糊,除非输入已预过滤,即它是对原始输入调用spline_filter的结果。- extra_arguments元组,可选
传递给 mapping 的额外参数。
- extra_keywordsdict, optional
传递给 mapping 的额外关键字参数。
- 返回:
- outputndarray
过滤后的输入。
附注
此函数还接受具有以下签名之一并包装在
scipy.LowLevelCallable中的底层回调函数。int mapping(npy_intp *output_coordinates, double *input_coordinates, int output_rank, int input_rank, void *user_data) int mapping(intptr_t *output_coordinates, double *input_coordinates, int output_rank, int input_rank, void *user_data)
调用函数遍历输出数组的元素,在每个元素处调用回调函数。当前输出元素的坐标通过
output_coordinates传递。回调函数必须在input_coordinates中返回进行插值所需的输入坐标。输入和输出数组的秩分别由input_rank和output_rank给出。user_data是按原样提供给scipy.LowLevelCallable的数据指针。回调函数必须返回一个整数错误状态,如果出错则返回零,否则返回一。如果发生错误,通常应在返回前设置带有信息性消息的 Python 错误状态,否则调用函数将设置默认的错误消息。
此外,还接受一些其他低级函数指针规范,但这些仅用于向后兼容,在新代码中不应使用。
对于复数类型的 input,此函数分别对实部和虚部进行变换。
1.6.0 版本已添加: 添加了复值支持。
数组 API 标准支持
geometric_transform除了 NumPy 之外,还对兼容 Python 数组 API 标准的后端提供了实验性支持。请考虑通过设置环境变量SCIPY_ARRAY_API=1并提供 CuPy、PyTorch、JAX 或 Dask 数组作为数组参数来测试这些功能。支持以下后端和设备(或其他功能)的组合。库
CPU
GPU
NumPy
✅
不适用
CuPy
不适用
⛔
PyTorch
✅
⛔
JAX
⚠️ 无 JIT
⛔
Dask
⚠️ 计算图
不适用
有关更多信息,请参阅 对数组 API 标准的支持。
示例
>>> import numpy as np >>> from scipy.ndimage import geometric_transform >>> a = np.arange(12.).reshape((4, 3)) >>> def shift_func(output_coords): ... return (output_coords[0] - 0.5, output_coords[1] - 0.5) ... >>> geometric_transform(a, shift_func) array([[ 0. , 0. , 0. ], [ 0. , 1.362, 2.738], [ 0. , 4.812, 6.187], [ 0. , 8.263, 9.637]])
>>> b = [1, 2, 3, 4, 5] >>> def shift_func(output_coords): ... return (output_coords[0] - 3,) ... >>> geometric_transform(b, shift_func, mode='constant') array([0, 0, 0, 1, 2]) >>> geometric_transform(b, shift_func, mode='nearest') array([1, 1, 1, 1, 2]) >>> geometric_transform(b, shift_func, mode='reflect') array([3, 2, 1, 1, 2]) >>> geometric_transform(b, shift_func, mode='wrap') array([2, 3, 4, 1, 2])