ResizingOperator¶
- class odl.discr.discr_ops.ResizingOperator(*args, **kwargs)[source]¶
Bases:
OperatorOperator mapping a discretized function to a new domain.
This operator is a mapping between uniformly discretized
DiscretizedSpacespaces with the sameDiscretizedSpace.cell_sides, but differentDiscretizedSpace.shape. The underlying operation is array resizing, i.e. no resampling is performed. In axes where the domain is enlarged, the new entries are filled ("padded") according to a provided parameterpad_mode.All resizing operator variants are linear, except constant padding with constant != 0.
See the online documentation on resizing operators for mathematical details.
- Attributes:
adjointAdjoint of this operator.
axesDimensions in which an actual resizing is performed.
domainSet of objects on which this operator can be evaluated.
inverse(Pseudo-)Inverse of this operator.
is_functionalTrueif this operator's range is aField.is_linearTrueif this operator is linear.offsetNumber of cells added to/removed from the left.
pad_constConstant used by this operator in case of constant padding.
pad_modePadding mode used by this operator.
rangeSet in which the result of an evaluation of this operator lies.
Methods
__call__(x[, out])Return
self(x[, out, **kwargs]).derivative(point)Derivative of this operator at
point.norm([estimate])Return the operator norm of this operator.
- __init__(domain, range=None, ran_shp=None, **kwargs)[source]¶
Initialize a new instance.
- Parameters:
- domainuniform
DiscretizedSpace Uniformly discretized space, the operator can be applied to its elements.
- rangeuniform
DiscretizedSpace, optional Uniformly discretized space in which the result of the application of this operator lies. For the default
None, a space with the same attributes asdomainis used, except for its shape, which is set toran_shp.- ran_shpsequence of ints, optional
Shape of the range of this operator. This can be provided instead of
rangeand is mandatory ifrangeisNone.- offsetint or sequence of ints, optional
Number of cells to add to/remove from the left of
domain.partition. By default, the difference is distributed evenly, with preference for left in case of ambiguity. This option is can only be used together withran_shp.- pad_modestring, optional
Method to be used to fill in missing values in an enlarged array.
'constant': Fill withpad_const.'symmetric': Reflect at the boundaries, not doubling the outmost values. This requires left and right padding sizes to be strictly smaller than the original array shape.'periodic': Fill in values from the other side, keeping the order. This requires left and right padding sizes to be at most as large as the original array shape.'order0': Extend constantly with the outmost values (ensures continuity).'order1': Extend with constant slope (ensures continuity of the first derivative). This requires at least 2 values along each axis where padding is applied.- pad_constscalar, optional
Value to be used in the
'constant'padding mode.- discr_kwargs: dict, optional
Keyword arguments passed to the
uniform_discrconstructor.
- domainuniform
Examples
The simplest way of initializing a resizing operator is by providing
ran_shpand, optionally, parameters for the padding variant to be used. The range is inferred fromdomainand the supplied parameters. If nooffsetis given, the difference in size is evenly distributed to both sides:>>> space = odl.uniform_discr([0, 0], [1, 1], (2, 4)) >>> resize_op = odl.ResizingOperator(space, ran_shp=(4, 4)) >>> resize_op.range uniform_discr([-0.5, 0. ], [ 1.5, 1. ], (4, 4))
Testing different padding methods in the first axis (zero padding is the default):
>>> x = [[1, 2, 3, 4], ... [5, 6, 7, 8]] >>> resize_op = odl.ResizingOperator(space, ran_shp=(4, 4)) >>> print(resize_op(x)) [[ 0., 0., 0., 0.], [ 1., 2., 3., 4.], [ 5., 6., 7., 8.], [ 0., 0., 0., 0.]] >>> >>> resize_op = odl.ResizingOperator(space, ran_shp=(4, 4), ... offset=(0, 0), ... pad_mode='periodic') >>> print(resize_op(x)) [[ 1., 2., 3., 4.], [ 5., 6., 7., 8.], [ 1., 2., 3., 4.], [ 5., 6., 7., 8.]] >>> >>> resize_op = odl.ResizingOperator(space, ran_shp=(4, 4), ... offset=(0, 0), ... pad_mode='order0') >>> print(resize_op(x)) [[ 1., 2., 3., 4.], [ 5., 6., 7., 8.], [ 5., 6., 7., 8.], [ 5., 6., 7., 8.]]
Alternatively, the range of the operator can be provided directly. This requires that the partitions match, i.e. that the cell sizes are the same and there is no shift:
>>> # Same space as in the first example, see above >>> large_spc = odl.uniform_discr([-0.5, 0], [1.5, 1], (4, 4)) >>> resize_op = odl.ResizingOperator(space, large_spc, ... pad_mode='periodic') >>> print(resize_op(x)) [[ 5., 6., 7., 8.], [ 1., 2., 3., 4.], [ 5., 6., 7., 8.], [ 1., 2., 3., 4.]]