【发布时间】:2017-04-04 11:15:53
【问题描述】:
我有一个二维数组 x,每一行都有不同数量的 nan 值:
array([[ nan, -0.355, -0.036, ..., nan, nan],
[ nan, -0.341, -0.047, ..., nan, 0.654],
[ .016, -1.147, -0.667, ..., nan, nan],
...,
[ nan, 0.294, -0.235, ..., 0.65, nan]])
给定这个数组,对于每一行,我想计算前 25 个百分位数内所有值的平均值。我正在执行以下操作:
limit = np.nanpercentile(x, 25, axis=1) # output 1D array
ans = np.nanmean(x * (x < limit[:,None]), axis=1)
但这给出了错误的结果——特别是计数(np.nansum/np.nanmean)无论我选择什么百分位数都保持不变,因为比较在不正确的地方产生零,并被视为有效值意思是。我不能简单地使用x[x>limit[:,None]],因为它给出了一个一维数组,我需要一个二维结果。
我通过以下方式解决了它:
f = x.copy()
f[f > limit[:,None]] = np.nan
ans = np.nanmean(f, axis=1)
有更好的方法吗?
【问题讨论】:
-
你的意思是
limit,你在哪里写了low?如果是这样,那么我认为这正是我会采用的程序。您正在寻找哪种更好的方法? -
谢谢,是的,这就是极限。最好想要一种没有太多中间步骤的方法,因为有了这个方法,我每次想要另一个百分位数时都需要创建一个副本。
标签: numpy multidimensional-array vectorization nan array-broadcasting