autocti.Array2D#
- class autocti.Array2D(values: Union[ndarray, List, AbstractArray2D], mask: Mask2D, header: Optional[Header] = None, store_native: bool = False, skip_mask: bool = False, *args, **kwargs)[source]#
Bases:
AbstractArray2DA uniform 2D array of values, which are paired with a 2D mask of pixels which may be split into sub-pixels.
The
Array2D`, like all data structures (e.g. ``Grid2D,VectorYX2D) has in-built functionality which:Applies a 2D mask (a
Mask2Dobject) to the da_ta structure’s values.Maps the data structure between two data representations: slim` (all unmasked values in a 1D
ndarray) andnative(all unmasked values in a 2Dndarray).Associates Cartesian
Grid2Dobjects of (y,x) coordinates with the data structure (e.g. a (y,x) grid of all unmasked pixels).Associates sub-grids with the data structure, which perform calculations higher resolutions which are then binned up.
Each entry of an
Array2Dcorresponds to a value at the centre of a sub-pixel in its correspondingMask2D. It is ordered such that pixels begin from the top-row of the corresponding mask and go right and down. The positive y-axis is upwards and positive x-axis to the right.A detailed description of the data structure API is provided below.
SLIM DATA REPRESENTATION (sub-size=1)
Below is a visual illustration of an
Array2D’s 2D mask, where a total of 10 pixels are unmasked and are included in the array.x x x x x x x x x x x x x x x x x x x x This is an example ``Mask2D``, where: x x x x x x x x x x x x x x O O x x x x x = `True` (Pixel is masked and excluded from the array) x x x O O O O x x x O = `False` (Pixel is not masked and included in the array) x x x O O O O x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
The mask pixel index’s are as follows (the positive / negative direction of the
Grid2Dobjects associated with the array are also shown on the y and x axes).<--- -ve x +ve --> x x x x x x x x x x ^ array_2d[0] = 10 x x x x x x x x x x I array_2d[1] = 20 x x x x x x x x x x I array_2d[2] = 30 x x x x 0 1 x x x x +ve array_2d[3] = 40 x x x 2 3 4 5 x x x y array_2d[4] = 50 x x x 6 7 8 9 x x x -ve array_2d[5] = 60 x x x x x x x x x x I array_2d[6] = 70 x x x x x x x x x x I array_2d[7] = 80 x x x x x x x x x x \/ array_2d[8] = 90 x x x x x x x x x x array_2d[9] = 100
The
Array2Din itsslimdata representation is anndarrayof shape [total_unmasked_pixels].For the
Mask2Dabove theslimrepresentation therefore contains 10 entries and two examples of these entries are:array[3] = the 4th unmasked pixel's value, given by value 40 above. array[6] = the 7th unmasked pixel's value, given by value 80 above.
A Cartesian grid of (y,x) coordinates, corresponding to all
slimvalues (e.g. unmasked pixels) is given byarray_2d.derive_grid.masked.slim.NATIVE DATA REPRESENTATION (sub_size=1)
The
Array2Dabove, but represented as an anndarrayof shape [total_y_values, total_x_values], where all masked entries have values of 0.0.For the following mask:
x x x x x x x x x x x x x x x x x x x x This is an example ``Mask2D``, where: x x x x x x x x x x x x x x O O x x x x x = `True` (Pixel is masked and excluded from the array) x x x O O O O x x x O = `False` (Pixel is not masked and included in the array) x x x O O O O x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
Where the array has the following indexes (left figure) and values (right):
<--- -ve x +ve --> x x x x x x x x x x ^ array_2d[0] = 10 x x x x x x x x x x I array_2d[1] = 20 x x x x x x x x x x I array_2d[2] = 30 x x x x 0 1 x x x x +ve array_2d[3] = 40 x x x 2 3 4 5 x x x y array_2d[4] = 50 x x x 6 7 8 9 x x x -ve array_2d[5] = 60 x x x x x x x x x x I array_2d[6] = 70 x x x x x x x x x x I array_2d[7] = 80 x x x x x x x x x x \/ array_2d[8] = 90 x x x x x x x x x x array_2d[9] = 100
In the above array:
- array[0,0] = 0.0 (it is masked, thus zero) - array[0,0] = 0.0 (it is masked, thus zero) - array[3,3] = 0.0 (it is masked, thus zero) - array[3,3] = 0.0 (it is masked, thus zero) - array[3,4] = 10 - array[3,5] = 20 - array[4,5] = 50
SLIM TO NATIVE MAPPING
The
Array2Dhas functionality which maps data between theslimandnativedata representations.For the example mask above, the 1D
ndarraygiven bymask.derive_indexes.slim_to_nativeis:slim_to_native[0] = [3,4] slim_to_native[1] = [3,5] slim_to_native[2] = [4,3] slim_to_native[3] = [4,4] slim_to_native[4] = [4,5] slim_to_native[5] = [4,6] slim_to_native[6] = [5,3] slim_to_native[7] = [5,4] slim_to_native[8] = [5,5] slim_to_native[9] = [5,6]
SUB GRIDDING
If the
Mask2Dsub_sizeis > 1, the array has entries corresponding to the values at the centre of every sub-pixel of each unmasked pixel.The sub-array indexes are ordered such that pixels begin from the first (top-left) sub-pixel in the first unmasked pixel. Indexes then go over the sub-pixels in each unmasked pixel, for every unmasked pixel.
Therefore, the shapes of the sub-array are as follows:
slimrepresentation: anndarrayof shape [total_unmasked_pixels*sub_size**2].nativerepresentation: anndarrayof shape [total_y_values*sub_size, total_x_values*sub_size].
Below is a visual illustration of a sub array. Indexing of each sub-pixel goes from the top-left corner. In contrast to the array above, our illustration below restricts the mask to just 2 pixels, to keep the illustration brief.
x x x x x x x x x x x x x x x x x x x x This is an example ``Mask2D``, where: x x x x x x x x x x x x x x x x x x x x x = `True` (Pixel is masked and excluded from lens) x 0 0 x x x x x x x O = `False` (Pixel is not masked and included in lens) x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
If
sub_size=2, each unmasked pixel has 4 (2x2) sub-pixel values. For the example above, pixels 0 and 1 each have 4 values which map to thearray_2d’sslimrepresentation as follows:Pixel 0 - (2x2): array_2d.slim[0] = value of first sub-pixel in pixel 0. 0 1 array_2d.slim[1] = value of first sub-pixel in pixel 1. 2 3 array_2d.slim[2] = value of first sub-pixel in pixel 2. array_2d.slim[3] = value of first sub-pixel in pixel 3. Pixel 1 - (2x2): array_2d.slim[4] = value of first sub-pixel in pixel 0. 4 5 array_2d.slim[5] = value of first sub-pixel in pixel 1. 6 7 array_2d.slim[6] = value of first sub-pixel in pixel 2. array_2d.slim[7] = value of first sub-pixel in pixel 3.
For the
nativedata representation we get the following mappings:Pixel 0 - (2x2): array_2d.native[8, 2] = value of first sub-pixel in pixel 0. 0 1 array_2d.native[8, 3] = value of first sub-pixel in pixel 1. 2 3 array_2d.native[9, 2] = value of first sub-pixel in pixel 2. array_2d.native[9, 3] = value of first sub-pixel in pixel 3. Pixel 1 - (2x2): array_2d.native[10, 4] = value of first sub-pixel in pixel 0. 4 5 array_2d.native[10, 5] = value of first sub-pixel in pixel 1. 6 7 array_2d.native[11, 4] = value of first sub-pixel in pixel 2. array_2d.native[11, 5] = value of first sub-pixel in pixel 3. Other entries (all masked sub-pixels are zero): array_2d.native[0, 0] = 0.0 (it is masked, thus zero) array_2d.native[15, 12] = 0.0 (it is masked, thus zero)
If we used a sub_size of 3, for pixel 0 we we would create a 3x3 sub-array:
array_2d.slim[0] = value of first sub-pixel in pixel 0. array_2d.slim[1] = value of first sub-pixel in pixel 1. array_2d.slim[2] = value of first sub-pixel in pixel 2. 0 1 2 array_2d.slim[3] = value of first sub-pixel in pixel 3. 3 4 5 array_2d.slim[4] = value of first sub-pixel in pixel 4. 6 7 8 array_2d.slim[5] = value of first sub-pixel in pixel 5. array_2d.slim[6] = value of first sub-pixel in pixel 6. array_2d.slim[7] = value of first sub-pixel in pixel 7. array_2d.slim[8] = value of first sub-pixel in pixel 8.
In PyAutoCTI all Array2D objects are used in their native representation without sub-gridding. Significant memory can be saved by only store this format, thus the native_binned_only config override can force this behaviour. It is recommended users do not use this option to avoid unexpected behaviour.
- Parameters:
values – The values of the array, which can be input in the
slimornativeformat.mask – The 2D mask associated with the array, defining the pixels each array value in its
slimrepresentation is paired with.store_native – If True, the ndarray is stored in its native format [total_y_pixels, total_x_pixels]. This avoids mapping large data arrays to and from the slim / native formats, which can be a computational bottleneck.
Examples
This example uses the
Array2D.no_maskmethod to create theArray2D.Different methods using different inputs are available and documented throughout this webpage.
import autoarray as aa # Make Array2D from input np.ndarray with sub_size 1. array_2d = aa.Array2D.no_mask( values=np.array([1.0, 2.0, 3.0, 4.0]), shape_native=(2, 2), pixel_scales=1.0, sub_size=1 ) # Make Array2D from input list with different shape_native and sub_size 1. array_2d = aa.Array2D.no_mask( values=[1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape_native=(2, 3), pixel_scales=1.0, sub_size=1 )
import autoarray as aa # Make Array2D with sub_size 2. array_2d = aa.Array2D.no_mask( values=[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0], shape_native=(2, 1), pixel_scales=1.0, sub_size=2, ) # Apply 2D mask to Array2D with sub_size 2, where the # True value masks entries (5.0, 6.0, 7.0, 8.0). mask = aa.Mask2D( mask=[[False], [True]], pixel_scales=2.0, sub_size=2 ) array_2d = array_2d.apply_mask(mask=mask) # Print certain array attributes. print(array_2d.slim) # masked 1D data representation on sub-grid. print(array_2d.native) # masked 2D data representation on sub-grid. print(array_2d.slim.binned) # masked 1D data representation binned up from sub-grid. print(array_2d.native.binned) # masked 2D data representation binned up from sub-grid. # Output array to .fits file. array_2d.output_to_fits(file_path="/path/for/output")
Methods
allapply_maskastypecopyextent_of_zoomed_arrayFor an extracted zoomed array computed from the method zoomed_around_mask compute its extent in scaled coordinates.
flip_hdu_for_ds9Returns an
Array2Dby loading the array values from a .fits file.Returns an
Array2Dby from a PrimaryHDU object which has been loaded via astropy.fitsReturns an
Array2Dby inputting the y and x pixel values where the array is filled and the values that fill it.Returns an
Array2Dwhere all values are filled with an input fill value, analogous tonp.full().instance_flattenFlatten an instance of an autoarray class into a tuple of its attributes (i.e.
instance_unflattenUnflatten a tuple of attributes (i.e.
invertmaxminReturns an
Array2Dfrom an array via inputs in its slim or native data representation.Returns an
Array2Dwhere all values are filled with ones, analogous tonp.ones().output_to_fitsOutput the array to a .fits file.
padded_before_convolution_fromWhen the edge pixels of a mask are unmasked and a convolution is to occur, the signal of edge pixels will be 'missing' if the grid is used to evaluate the signal via an analytic function.
reshaperesized_fromResize the array around its centre to a new input shape.
sqrtstructure_2d_fromstructure_2d_list_fromsumtrimmed_after_convolution_fromWhen the edge pixels of a mask are unmasked and a convolution is to occur, the signal of edge pixels will be 'missing' if the grid is used to evaluate the signal via an analytic function.
with_new_arrayCopy this object but give it a new array.
Returns an
Array2Dwhere all values are filled with zeros, analogous tonp.zeros().zoomed_around_maskExtract the 2D region of an array corresponding to the rectangle encompassing all unmasked values.
Attributes
arraybinnedConvenience method to access the binned-up array in its 1D representation, which is a Grid2D stored as an
ndarrayof shape [total_unmasked_pixels, 2].binned_across_columnsBins the 2D array up to a 1D array, where each value is the mean of all unmasked values in each column.
binned_across_rowsBins the 2D array up to a 1D array, where each value is the mean of all unmasked values in each row.
derive_gridderive_indexesderive_maskdtypegeometryhdu_for_outputThe array as an HDU object, which can be output to a .fits file.
imagin_countsin_counts_per_secondnativeReturn a Array2D where the data is stored in its native representation, which is an
ndarrayof shape [sub_size*total_y_pixels, sub_size*total_x_pixels].native_skip_maskReturn a Array2D where the data is stored in its native representation, which is an
ndarrayof shape [sub_size*total_y_pixels, sub_size*total_x_pixels].ndimoriginoriginal_orientationpixel_areapixel_scalepixel_scale_headerpixel_scalesreadout_offsetsrealshapeshape_nativeshape_slimsizeslimReturn an Array2D where the data is stored its slim representation, which is an
ndarrayof shape [total_unmasked_pixels * sub_size**2].store_nativesub_shape_nativesub_shape_slimsub_sizetotal_areatotal_pixelsunmasked_gridvalues- classmethod no_mask(values: Union[ndarray, List, AbstractArray2D], pixel_scales: Union[Tuple[float], Tuple[float, float], float], shape_native: Optional[Tuple[int, int]] = None, sub_size: int = 1, origin: Tuple[float, float] = (0.0, 0.0), header: Optional[Header] = None) Array2D[source]#
Returns an
Array2Dfrom an array via inputs in its slim or native data representation.From a
slim1D input the method cannot determine the 2D shape of the array and its mask. Theshape_nativemust therefore also be input into this method. The mask is setup as a unmasked Mask2D ofshape_native.For a full description of
Array2Dobjects, including a description of theslimandnativeattribute used by the API, see theArray2D class API documentation.- Parameters:
values – The values of the array input with shape [total_unmasked_pixels*(sub_size**2)] or shape [total_y_pixels*sub_size, total_x_pixel*sub_size].
pixel_scales – The (y,x) scaled units to pixel units conversion factors of every pixel. If this is input as a float, it is converted to a (float, float) structure.
shape_native – The 2D shape of the array in its
nativeformat, and its 2D mask (only required if input shape is inslimformat).sub_size – The size (sub_size x sub_size) of each unmasked pixels sub-array.
origin – The (y,x) scaled units origin of the mask’s coordinate system.
Examples
import autoarray as aa # Make Array2D from input list, native format with sub_size 1 # (This array has shape_native=(2,2)). array_2d = aa.Array2D.manual( array=np.array([[1.0, 2.0], [3.0, 4.0]]), pixel_scales=1.0. sub_size=1 )
import autoarray as aa # Make Array2D from input list, slim format with sub_size 2. array_2d = aa.Array2D.no_mask( values=[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0], shape_native=(2, 1), pixel_scales=1.0, sub_size=2, )
- classmethod full(fill_value: float, shape_native: Tuple[int, int], pixel_scales: Union[Tuple[float], Tuple[float, float], float], sub_size: int = 1, origin: Tuple[float, float] = (0.0, 0.0), header: Optional[Header] = None) Array2D[source]#
Returns an
Array2Dwhere all values are filled with an input fill value, analogous tonp.full().For a full description of
Array2Dobjects, including a description of theslimandnativeattribute used by the API, see theArray2D class API documentation.From this input the method cannot determine the 2D shape of the array and its mask. The
shape_nativemust therefore also be input into this method. The mask is setup as a unmasked Mask2D ofshape_native.- Parameters:
fill_value – The value all array elements are filled with.
shape_native – The 2D shape of the array in its
nativeformat, and its 2D mask.pixel_scales – The (y,x) scaled units to pixel units conversion factors of every pixel. If this is input as a float, it is converted to a (float, float) structure.
sub_size – The size (sub_size x sub_size) of each unmasked pixels sub-array.
origin – The (y,x) scaled units origin of the mask’s coordinate system.
Examples
import autoarray as aa # Make Array2D with sub_size 1. array_2d = aa.Array2D.full( fill_value=2.0, shape_native=(2, 2), pixel_scales=1.0, sub_size=1 )
import autoarray as aa # Make Array2D with sub_size 2. array_2d = aa.Array2D.full( fill_value=2.0, shape_native=(2, 2), pixel_scales=1.0, sub_size=2 )
- classmethod ones(shape_native: Tuple[int, int], pixel_scales: Union[Tuple[float], Tuple[float, float], float], sub_size: int = 1, origin: Tuple[float, float] = (0.0, 0.0), header: Optional[Header] = None) Array2D[source]#
Returns an
Array2Dwhere all values are filled with ones, analogous tonp.ones().For a full description of
Array2Dobjects, including a description of theslimandnativeattribute used by the API, see theArray2D class API documentation.From this input the method cannot determine the 2D shape of the array and its mask. The
shape_nativemust therefore also be input into this method. The mask is setup as a unmasked Mask2D ofshape_native.- Parameters:
shape_native – The 2D shape of the array in its
nativeformat, and its 2D mask.pixel_scales – The (y,x) scaled units to pixel units conversion factors of every pixel. If this is input as a float, it is converted to a (float, float) structure.
sub_size – The size (sub_size x sub_size) of each unmasked pixels sub-array.
origin – The (y,x) scaled units origin of the mask’s coordinate system.
Examples
import autoarray as aa # Make Array2D with sub_size 1. array_2d = aa.Array2D.ones( shape_native=(2, 2), pixel_scales=1.0, sub_size=1 )
import autoarray as aa # Make Array2D with sub_size 2. array_2d = aa.Array2D.ones( shape_native=(2, 2), pixel_scales=1.0, sub_size=2 )
- classmethod zeros(shape_native: Tuple[int, int], pixel_scales: Union[Tuple[float], Tuple[float, float], float], sub_size: int = 1, origin: Tuple[float, float] = (0.0, 0.0), header: Optional[Header] = None) Array2D[source]#
Returns an
Array2Dwhere all values are filled with zeros, analogous tonp.zeros().For a full description of
Array2Dobjects, including a description of theslimandnativeattribute used by the API, see theArray2D class API documentation.From this input the method cannot determine the 2D shape of the array and its mask. The
shape_nativemust therefore also be input into this method. The mask is setup as a unmasked Mask2D ofshape_native.- Parameters:
shape_native – The 2D shape of the array in its
nativeformat, and its 2D mask.pixel_scales – The (y,x) scaled units to pixel units conversion factors of every pixel. If this is input as a float, it is converted to a (float, float) structure.
sub_size – The size (sub_size x sub_size) of each unmasked pixels sub-array.
origin – The (y,x) scaled units origin of the mask’s coordinate system.
Examples
import autoarray as aa # Make Array2D with sub_size 1. array_2d = aa.Array2D.zeros( shape_native=(2, 2), pixel_scales=1.0, sub_size=1 )
import autoarray as aa # Make Array2D with sub_size 2. array_2d = aa.Array2D.zeros( shape_native=(2, 2), pixel_scales=1.0, sub_size=2 )
- classmethod from_fits(file_path: Union[Path, str], pixel_scales: Optional[Union[Tuple[float], Tuple[float, float], float]], hdu: int = 0, sub_size: int = 1, origin: Tuple[float, float] = (0.0, 0.0)) Array2D[source]#
Returns an
Array2Dby loading the array values from a .fits file.For a full description of
Array2Dobjects, including a description of theslimandnativeattribute used by the API, see theArray2D class API documentation.- Parameters:
file_path – The path the file is loaded from, including the filename and the .fits extension, e.g. ‘/path/to/filename.fits’
pixel_scales – The (y,x) scaled units to pixel units conversion factors of every pixel. If this is input as a float, it is converted to a (float, float) structure.
hdu – The Header-Data Unit of the .fits file the array data is loaded from.
sub_size – The size (sub_size x sub_size) of each unmasked pixels sub-array.
origin – The (y,x) scaled units origin of the coordinate system.
Examples
import autoarray as aa # Make Array2D with sub_size 1. array_2d = aa.Array2D.from_fits( file_path="path/to/file.fits", hdu=0, pixel_scales=1.0, sub_size=1 )
import autoarray as aa # Make Array2D with sub_size 2. # (It is uncommon that a sub-gridded array would be loaded from # a .fits, but the API support its). array_2d = aa.Array2D.from_fits( file_path="path/to/file.fits", hdu=0, pixel_scales=1.0, sub_size=2 )
- classmethod from_primary_hdu(primary_hdu: PrimaryHDU, sub_size: int = 1, origin: Tuple[float, float] = (0.0, 0.0)) Array2D[source]#
Returns an
Array2Dby from a PrimaryHDU object which has been loaded via astropy.fitsThis assumes that the header of the PrimaryHDU contains an entry named PIXSCALE which gives the pixel-scale of the array.
For a full description of
Array2Dobjects, including a description of theslimandnativeattribute used by the API, see theArray2D class API documentation.- Parameters:
primary_hdu – The PrimaryHDU object which has already been loaded from a .fits file via astropy.fits and contains the array data and the pixel-scale in the header with an entry named PIXSCALE.
sub_size – The size (sub_size x sub_size) of each unmasked pixels sub-array.
origin – The (y,x) scaled units origin of the coordinate system.
Examples
from astropy.io import fits import autoarray as aa # Make Array2D with sub_size 1. primary_hdu = fits.open("path/to/file.fits") array_2d = aa.Array2D.from_primary_hdu( primary_hdu=primary_hdu, sub_size=1 )
import autoarray as aa # Make Array2D with sub_size 2. # (It is uncommon that a sub-gridded array would be loaded from # a .fits, but the API support its). primary_hdu = fits.open("path/to/file.fits") array_2d = aa.Array2D.from_primary_hdu( primary_hdu=primary_hdu, sub_size=2 )
- classmethod from_yx_and_values(y: Union[ndarray, List], x: Union[ndarray, List], values: Union[ndarray, List], shape_native: Tuple[int, int], pixel_scales: Union[Tuple[float], Tuple[float, float], float], sub_size: int = 1, header: Optional[Header] = None) Array2D[source]#
Returns an
Array2Dby inputting the y and x pixel values where the array is filled and the values that fill it.For a full description of
Array2Dobjects, including a description of theslimandnativeattribute used by the API, see theArray2D class API documentation.- Parameters:
y – The y pixel indexes where value are input, with shape [total_unmasked_pixels*sub_size].
x – The x pixel indexes where value are input, with shape [total_unmasked_pixels*sub_size].
list (values or) – The values which are used to fill in the array, with shape [total_unmasked_pixels*sub_size].
shape_native – The 2D shape of the array in its
nativeformat, and its 2D mask.pixel_scales – The (y,x) scaled units to pixel units conversion factors of every pixel. If this is input as a float, it is converted to a (float, float) structure.
sub_size – The size (sub_size x sub_size) of each unmasked pixels sub-grid.
origin – The origin of the grid’s mask.
Examples
import autoarray as aa # Make Array2D with sub_size 1. array_2d = aa.Array2D.from_yx_and_values( y=np.array([0.5, 0.5, -0.5, -0.5]), x=np.array([-0.5, 0.5, -0.5, 0.5]), values=np.array([1.0, 2.0, 3.0, 4.0]), shape_native=(2, 2), pixel_scales=1.0, sub_size=1, )
import autoarray as aa # Make Array2D with sub_size 2. array_2d = aa.Array2D.from_yx_and_values( y=np.array([1.0, 1.0. 0.5, 0.5, -0.5, -0.5, -1.0, -1.0]), x=np.array([-0.5, 0.5, -0.5, 0.5, -0.5, 0.5, -0.5, 0.5]), values=np.array([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]), shape_native=(2, 1), pixel_scales=1.0, sub_size=2, )