python - 计算每个元素相对于其列的百分位数分数

标签 python numpy scipy

所以我的 NumPy 数组看起来像这样

npfinal = 
    [[1, 3, 5, 0, 0, 0],
    [5, 2, 4, 0, 0, 0],
    [7, 7, 2, 0, 0, 0],
    .
    .
    .

我正在使用的示例数据集有 25k 行。

前 3 列包含有意义的数据,其余是百分位数的占位符。

所以我需要 a[0][0] 相对于 a[0][3] 中整个第一列的百分位。因此 1 的百分位数分数关于列 [1,5,7,...]

我的第一次尝试是:

import scipy.stats as ss
...
numofcols = 3
for row in npfinal:
    for i in range(0,numofcols):
        row[i+numofcols] = int(round(ss.percentileofscore(npfinal[:,i], row[i])))

但这花费了太多时间;在完整的数据集上这是不可能的。

我对如此大的数据集的计算领域很陌生,因此任何形式的帮助将不胜感激。

最佳答案

我找到了一个解决方案,我相信当数组中有重复值时效果更好:

import numpy as np
from scipy import stats

# some array with repeated values:
M = np.array([[1, 7, 2], [5, 2, 2], [5, 7, 2]])    

# calculate percentiles applying scipy rankdata to each column:
percentile = np.apply_along_axis(sp.stats.rankdata, 0, M, method='average')/len(M)

np.argsort 解决方案存在一个问题,即它对相同值的重复给出不同的百分位数。例如,如果您有:

percentile_argsort = np.argsort(np.argsort(M, axis=0), axis=0) / float(len(M)) * 100
percentile_rankdata = np.apply_along_axis(sp.stats.rankdata, 0, M, method='average')/len(M)

两种不同的方法将输出结果:

M
array([[1, 7, 2],
       [5, 2, 2],
       [5, 7, 2]])
percentile_argsort
array([[  0.        ,  33.33333333,   0.        ],
       [ 33.33333333,   0.        ,  33.33333333],
       [ 66.66666667,  66.66666667,  66.66666667]])
percentile_rankdata
array([[ 0.33333333,  0.83333333,  0.66666667],
       [ 0.83333333,  0.33333333,  0.66666667],
       [ 0.83333333,  0.83333333,  0.66666667]])

关于python - 计算每个元素相对于其列的百分位数分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25404705/

相关文章:

python - flask 实现?争论而不是/

python - 使用 Python 进行 2D 热传导

python - numpy:用于数组划分的简明条件语法

python - 尝试在 Python 中插入直方图函数的输出

python - 检查self是否是python中子类的实例

python - 为什么我无法使用 "Send_file"从 Flask 发送图像以使用react

python - 圆形阵列上的滚动窗口

python - 提取二维二进制数组的索引

python - 如何在Python中拟合阶跃函数

python - 如何通过Von Mises分布求周期间隔和周期均值?