如何将自定义函数应用于xarray.DataArray.coarsen.reduce()?

问题描述 投票:0回答:2

我有一个 (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'

非常感谢您的关注和参与。

python numpy python-xarray
2个回答
6
投票

传递给

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
以确保返回数组是二维的。这有点难看,所以我建议在您的应用程序中更多地考虑这部分。要理解的关键是返回数组需要与输入数组具有相同的维数。


0
投票

更好的方法是使用

scipy.stats.mode
接受
axis
参数。

def find_mode(arr, axis):
    m = stats.mode(arr, axis=axis)
    return m[0]
© www.soinside.com 2019 - 2024. All rights reserved.