我想获取元素的子集并快速将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该技巧不起作用。
答案 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
的重置仍然执行!