numpy.nanmean的元素子集

时间:2014-12-11 23:07:55

标签: python arrays numpy

我想获取元素的子集并快速将nanmean应用于关联的列,而不进行循环。

对于特异性,请考虑减少数组r=[0,2,3]和数据数组

a=np.array([
             [2,3,4],
             [3,np.NaN,5],
             [16,66,666],
             [2,2,5],
             [np.NaN,3,4],
             [np.NaN,4,5],
             [np.NaN,5,4],
             [3,6,4.5],
           ])

然后我想回来

b = np.array([
             [2.5,3,4.5],
             [16,66,666],
             [2.5,4,4.5],
           ])

this question的最佳答案是使用reduceat解决了问题(对于单个列)。对我来说很遗憾,因为nanmean不是ufunc该技巧不起作用。

1 个答案:

答案 0 :(得分:3)

我认为没有一个单行代码可以做到这一点,因为numpy中没有nan - 知道的ufunc。

但是,在(暂时)替换reduceat中的所有nans后,您可以根据a执行某些操作:

例如,这是一个快速功能,可以实现您想要的功能:

def nanmean_reduceat(x, indices):
    mask = np.isnan(x)
    # use try-finally to make sure x is reset
    # to its original state even if an error is raised.
    try:
        x[mask] = 0
        return np.add.reduceat(x, indices) / np.add.reduceat(~mask, indices)
    finally:
        x[mask] = np.nan

然后你可以打电话

>>> nanmean_reduceat(a, [0, 2, 3])
array([[   2.5,    3. ,    4.5],
       [  16. ,   66. ,  666. ],
       [   2.5,    4. ,    4.5]])

希望有所帮助!

编辑:为简洁起见,我删除了空except块并将return语句移到了try块中。由于finally语句的工作方式,x的重置仍然执行!