我有一个 (2x2) NumPy 数组:
ar = np.array([[2, 0],[3, 0]])
和xarray.DataArray形式相同:
da = xr.DataArray(ar, dims=['x', 'y'], coords=[[0, 1], [0, 1]])
我正在尝试使用自定义函数对二维数组进行空间下采样以查找众数(即最常出现的值):
def find_mode(window):
# find the mode over all axes
uniq = np.unique(window, return_counts=True)
return uniq[0][np.argmax(uniq[1])]
find_mode()
对于 ar
效果很好,因为 find_mode(ar)
给出 0
。
但是,它不适用于
da
(即da.coarsen(x=2, y=2).reduce(find_mode)
),并出现错误:
TypeError: find_mode() got an unexpected keyword argument 'axis'
非常感谢您的关注和参与。
DatasetCoarsen.reduce
的函数签名必须包含 axis
和 kwargs
。一个很好的例子是np.sum
。所以你的函数需要看起来像这样:
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
根据您的应用程序,您可能需要使用
axis
参数(整数元组)来代替 [0]
和 [1]
索引步骤。
注意:我在此处添加了
np.atleast_2d
以确保返回数组是二维的。这有点难看,所以我建议在您的应用程序中更多地考虑这部分。要理解的关键是返回数组需要与输入数组具有相同的维数。