def filter_uniform_filter(data, size=3, no_data_val=None,
func=np.nanmean):
"""
Parameters
----------
A = input data
size = odd number uniform filtering kernel size
no_data_val = value in matrix that is treated as no data value
Returns: nanmean of the matrix A filtered by a uniform kernel of size=size
-------
Adapted from: http://stackoverflow.com/questions/23829097/python-numpy-fastest-method-for-2d-kernel-rank-filtering-on-masked-arrays-and-o?rq=1
Notes:
This is equivalent to scipy.ndimage.uniform_filter, but can handle nan's,
and can use numpy nanmean/median/max/min functions.
no_data_val/nan handling can be found in filter_broadcast_uniform_filter in
this module.
Change function to nanmeadian, nanmax, nanmin as required.
"""
assert size % 2 == 1, 'Please supply an odd size'
rows, cols = data.shape
padded_A = np.empty(shape=(rows + size-1,
cols + size-1),
dtype=data.dtype)
padded_A[:] = np.nan
rows_pad, cols_pad = padded_A.shape
if no_data_val:
mask = data == no_data_val
data[mask] = np.nan
padded_A[size-1: rows_pad, size - 1: cols_pad] = data.copy()
n, m = data.shape
strided_data = as_strided(padded_A, (n, m, size, size),
padded_A.strides+padded_A.strides)
strided_data = strided_data.copy().reshape((n, m, size**2))
return func(strided_data, axis=2)
评论列表
文章目录