0

我有一个二维数组,每行都有零值。

[[5, 3, 2, 0, 0, 1, 6, 9, 11, 1, 4, 1],
 [0, 0, 12, 0, 1, 0, 0, 2, 0, 30, 2, 2],
 [120, 2, 10, 3, 0, 0, 2, 7, 9, 5, 0, 0]]

有没有办法通过排除计算中的零值来计算每行的 0.75 分位数?

[12,1,2,30,2,2]例如,在第二行中,计算中只应使用6 个非零值。我尝试使用np.quantile(),但它会在计算中包含所有零值。似乎 Numpy 也没有掩码数组np.ma版本quantile()

4

1 回答 1

3

您可以将零值替换为nan并将数组传递np.nanquantile()给以计算非nan值的分位数

>>> arr = np.array([[5, 3, 2, 0, 0, 1, 6, 9, 11, 1, 4, 1],
                    [0, 0, 12, 0, 1, 0, 0, 2, 0, 30, 2, 2],
                    [120, 2, 10, 3, 0, 0, 2, 7, 9, 5, 0, 0]], dtype='f')
 
>>> arr[arr==0] = np.nan
>>> arr
[[  5.   3.   2.  nan  nan   1.   6.   9.  11.   1.   4.   1.]
 [ nan  nan  12.  nan   1.  nan  nan   2.  nan  30.   2.   2.]
 [120.   2.  10.   3.  nan  nan   2.   7.   9.   5.  nan  nan]]

>>> arr_quantile75 = np.nanquantile(arr, 0.75, axis=1)  #by row-axis
>>> arr_quantile75
[5.75 9.5  9.25]

np.nanquantile() 计算沿指定轴的数据的第 q 个分位数,同时忽略 nan 值[来源]

于 2021-11-17T14:52:36.193 回答