首页 > 解决方案 > 沿轴计算多维数组中某个值的百分位排名

问题描述

我有一个 3D 维数组。

>>> M2 = np.arange(24).reshape((4, 3, 2))
>>> print(M2)
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5]],

       [[ 6,  7],
        [ 8,  9],
        [10, 11]],

       [[12, 13],
        [14, 15],
        [16, 17]],

       [[18, 19],
        [20, 21],
        [22, 23]]])

我想计算沿轴 = 0 的特定值的百分位等级。

例如,如果值 = 4,则预期输出为:

[[0.25, 0.25],
 [0.25, 0.25],
 [0.25, 0.0]]

其中 [0][0] 处的 0.25 是 [0, 6, 12, 18] 等中 4 的百分位等级。

如果值 = 2.5,则预期输出为:

[[0.25, 0.25],
 [0.25, 0.0],
 [0.0, 0.0]]

我在考虑使用scipy.stats.percentileofscore,但这似乎不适用于多维数组。

- - - - - - - - - - - - - - 编辑 - - - - - - - - - - - ------

被埃文的评论启发了。我想出了一个使用scipy.stats.percentileofscore.

percentile_rank_lst = []
for p in range(M2.shape[1]):
    for k in range(M2.shape[2]):
        M2_ = M2[:, p, k]
        percentile_rank = (stats.percentileofscore(M2_, 4)) / 100
        percentile_rank_lst.append(percentile_rank)

percentile_rank_nparr = np.array(percentile_rank_lst).reshape(M2.shape[1], M2.shape[2])
print(percentile_rank_nparr)

输出是:

array([[0.25, 0.25],
 [0.25, 0.25],
 [0.25, 0.0]])

标签: pythonpandasnumpyscipypython-xarray

解决方案


我认为这可以完成工作:

def get_percentile(val, M=M2, axis=0):
    return (M > val).argmax(axis)/ M.shape[axis]

get_percentile(4)
#array([[0.25, 0.25],
#       [0.25, 0.25],
#       [0.25, 0.  ]])

get_percentile(2.5)
#array([[0.25, 0.25],
#       [0.25, 0.  ],
#       [0.  , 0.  ]])

推荐阅读