python - 沿轴计算多维数组中某个值的百分位排名
问题描述
我有一个 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]])
解决方案
我认为这可以完成工作:
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. ]])
推荐阅读
- python - 如何在 R 或 Python 语言中以状态空间形式估计 GARCH-M?
- javascript - 用于 slug url 的 Next.js 路由,例如 site.com/username
- ssh - 手动应答 SSH 质询响应身份验证
- sql - 尽管 Main Line 在标准中为 True,但在 NetSuite 中保存的搜索会为每个供应商账单返回多行
- sql - postgresql中group by的奇怪行为
- javascript - 搜索 objects.shortName 数组以及嵌套的对象数组
- python - 如何打印存储在列表中的对象的值
- r - R认为积分可能是发散的
- discord.py - 搜索会员功能
- python - 无法安装pyodbc,缺少头文件,命令提示符:致命错误C1083:无法打开包含文件:'windows.h':没有这样的文件或目录