如何计算沿3d阵列z轴的分数百分位数?

时间:2018-02-06 19:36:53

标签: python arrays numpy 3d scipy

我试图沿着3d numpy数组的z轴使用scipy.stats.percentileofscore()计算百分位数,得分为2d数组。

例如,我的3d数组可能如下所示:

data = array([[[ 1.,  1.,  1.],
    [ 1.,  1.,  1.],
    [ 1.,  1.,  1.]],
   [[ 2.,  2.,  2.],
    [ 2.,  2.,  2.],
    [ 2.,  2.,  2.]],
   [[ 3.,  3.,  3.],
    [ 3.,  3.,  3.],
    [ 3.,  3.,  3.]]])

计算百分位数的分数可能如下所示:

scores = array([[ 1.,  1.,  2.],
   [ 1.,  1.,  2.],
   [ 1.,  1.,  2.]])

我想以这种方式在每个位置(m,n)应用percentileofscore()

percentileofscore(data[:,m,n], scores[m,n])

结果将是:

array([[ 33.33,  33.33,  66.66],
   [ 33.33,  33.33,  66.66],
   [ 33.33,  33.33,  66.66]])

我可以使用嵌套循环执行此操作,但是将此应用于大型数组,因此需要更优化的方法。我很难绕过如何实现这一目标。

1 个答案:

答案 0 :(得分:1)

您可以通过重新整形数组来避免嵌套循环。我认为为了完全避免循环,你必须编写一个自定义百分位函数。

import numpy as np
from scipy.stats import percentileofscore

x = 3
y = 3
z = 3

d = a.reshape(z, x*y)

scores_d = scores.reshape(x*y,1)

percentiles_d = [percentileofscore(d[:, i], scores_d[i]) for i in range(x*y)]
percentiles_d = np.round(np.array(percentiles_d), 2).reshape(x,y)
print(percentiles_d)

[[ 33.33  33.33  66.67]
 [ 33.33  33.33  66.67]
 [ 33.33  33.33  66.67]]