discretize_model

astropy.convolution.discretize_model(model, x_range, y_range=None, mode='center', factor=10)[source] [edit on github]

Function to evaluate analytical model functions on a grid.

So far the function can only deal with pixel coordinates.

Parameters:
model : FittableModel or callable.

Analytic model function to be discretized. Callables, which are not an instances of FittableModel are passed to custom_model and then evaluated.

x_range : tuple

x range in which the model is evaluated. The difference between the upper an lower limit must be a whole number, so that the output array size is well defined.

y_range : tuple, optional

y range in which the model is evaluated. The difference between the upper an lower limit must be a whole number, so that the output array size is well defined. Necessary only for 2D models.

mode : str, optional
One of the following modes:
  • 'center' (default)
    Discretize model by taking the value at the center of the bin.
  • 'linear_interp'
    Discretize model by linearly interpolating between the values at the corners of the bin. For 2D models interpolation is bilinear.
  • 'oversample'
    Discretize model by taking the average on an oversampled grid.
  • 'integrate'
    Discretize model by integrating the model over the bin using scipy.integrate.quad. Very slow.
factor : float or int

Factor of oversampling. Default = 10.

Returns:
array : numpy.array

Model value array

Notes

The oversample mode allows to conserve the integral on a subpixel scale. Here is the example of a normalized Gaussian1D:

import matplotlib.pyplot as plt
import numpy as np
from astropy.modeling.models import Gaussian1D
from astropy.convolution.utils import discretize_model
gauss_1D = Gaussian1D(1 / (0.5 * np.sqrt(2 * np.pi)), 0, 0.5)
y_center = discretize_model(gauss_1D, (-2, 3), mode='center')
y_corner = discretize_model(gauss_1D, (-2, 3), mode='linear_interp')
y_oversample = discretize_model(gauss_1D, (-2, 3), mode='oversample')
plt.plot(y_center, label='center sum = {0:3f}'.format(y_center.sum()))
plt.plot(y_corner, label='linear_interp sum = {0:3f}'.format(y_corner.sum()))
plt.plot(y_oversample, label='oversample sum = {0:3f}'.format(y_oversample.sum()))
plt.xlabel('pixels')
plt.ylabel('value')
plt.legend()
plt.show()

(png, svg, pdf)

../_images/astropy-convolution-discretize_model-1.png