agpy 0.1 documentation

Source code for AG_image_tools.drizzle

import numpy

[docs]def masktozero(arr): """ Convert all NANs or masked elements of an array to zero, and return a numpy array (NOT a masked array). """ if hasattr(arr,'mask'): arr[arr.mask] = 0 else: arr[arr!=arr] = 0 return numpy.array(arr)
[docs]def drizzle(tstomap,ts,mapshape,weights=1,weightmap=None): """ Drizzle a timestream onto a map. Returns the map of the weighted average per pixel of the input timestream. (note that this works for any 1D array with a same-size mapping to an image; I've written it with timestreams in mind though) tstomap - mapping from timestream -> map. len(tstomap) = len(ts) Both tstomap and ts should be one-dimensional, but they'll be raveled if you don't do it yourself weights - needs to have the same dimensions as ts *or* be scalar (default=1) mapshape - [nx,ny] simple 2D map specification. Make sure your map includes all points mapped to You can specify a weightmap to increase efficiency instead of computing it """ newmap = numpy.zeros(mapshape) # don't need to mask out when adding zero; simplifies indexing to have no masks ts_to_index = masktozero((ts*weights).ravel()) if len(tstomap.shape) > 1: # tstomap must be flat tstomap = tstomap.ravel() tsmapped = numpy.bincount(tstomap,ts_to_index) # bincount has length = argmax(tstomap), but the x/y index arrays # go all the way to the full map size. Append zeros to fill maxind = mapshape[0]*mapshape[1] if tsmapped.shape[0] < maxind: tsmapped = numpy.concatenate([tsmapped, numpy.zeros(maxind-tsmapped.shape[0])]) xinds,yinds = (a.ravel() for a in numpy.indices(mapshape)) newmap[xinds,yinds] = tsmapped # do the same for weights unless a weightmap is specified if weightmap is None: wm = numpy.zeros(mapshape) if numpy.isscalar(weights): weights_to_index = numpy.ones(ts_to_index.shape)*weights else: weights_to_index = masktozero((weights).ravel()) tsweights = numpy.bincount(tstomap,weights_to_index) if tsweights.shape[0] < maxind: tsweights = numpy.concatenate([tsweights, numpy.zeros(maxind-tsweights.shape[0])]) wm[xinds,yinds] = tsweights else: wm = weightmap return newmap/wm