所以我的 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/