I have a (2x2) NumPy array:
ar = np.array([[2, 0],[3, 0]])
and the same one in the form of xarray.DataArray:
da = xr.DataArray(ar, dims=['x', 'y'], coords=[[0, 1], [0, 1]])
I am trying to downsample the 2d array spatially using a custom function to find the mode (i.e., the most frequently occurring value):
def find_mode(window):
# find the mode over all axes
uniq = np.unique(window, return_counts=True)
return uniq[0][np.argmax(uniq[1])]
The find_mode() works well for ar as find_mode(ar) gives 0.
However, it doesn't work for da (i.e., da.coarsen(x=2, y=2).reduce(find_mode)), with an error:
TypeError: find_mode() got an unexpected keyword argument 'axis'
Thank you so much for your attention and participation.
CodePudding user response:
The signature for functions passed to DatasetCoarsen.reduce must include axis and kwargs. A good example is np.sum. So your function would need to look something like:
def find_mode(window, axis=None, **kwargs):
# find the mode over all axes
uniq = np.unique(window, return_counts=True)
ret = uniq[0][np.argmax(uniq[1])]
ret = np.atleast_2d(ret)
return ret
Depending on your application, you may want to use the axis argument (tuple of integers) in place of your [0] and [1] indexing steps.
Note: I've added np.atleast_2d here to make sure the return array is 2D. This is a bit ugly so I recommend thinking a bit more about this part in your application. The key thing to understand is that the return array needs to have the same number of dimensions as the input array.
