gpt4 book ai didi

python - 百分位计算 : Can I convert this for loop to a vector operation?

转载 作者:行者123 更新时间:2023-12-04 10:50:25 25 4
gpt4 key购买 nike

我有一个分数数组作为输入,我想输出一个数组,每个分数都附有百分位数。我有意识地不使用 stats.percentileofscore()因为我以此为契机来学习 numpy 数据处理和操作。

鉴于输入:

math_scores = np.array([51, 61, 45, 72, 78, 61, 84, 50, 42, 57])

我希望输出 print(scores_with_percentile)成为:
[[51 35]
[61 60]
[45 15]
[72 75]
[78 85]
[61 60]
[84 95]
[50 25]
[42 5]
[57 45]]

计算基于此 wikipedia page 中的公式

我写了以下代码:

math_scores = np.array([51, 61, 45, 72, 78, 61, 84, 50, 42, 57])
data_size = math_scores.shape
percentile_col = np.zeros(data_size, dtype=int)

for i, score in enumerate(math_scores):
count = (math_scores < score).sum()
freq = (math_scores == score).sum()
percentile_col[i] = (count + (0.5*freq))*100/data_size

scores_with_percentile = np.stack((math_scores, percentile_col), axis=1)
print(scores_with_percentile)

这对我来说很好用,但我确信它不是很有效,因为我才刚刚开始熟悉 numpy。
我想知道是否可以通过使用一些向量操作来避免 for 循环。
也欢迎任何其他改进代码的建议。

最佳答案

每当我们想要遍历同一个 numpy 数组的元素时,我们可以在新轴上创建另一个数组。因此我们可以在 2D 数组上使用 numpy 的矢量化函数。

math_scores = np.array([51, 61, 45, 72, 78, 61, 84, 50, 42, 57])
data_size = math_scores.shape
count = np.less(math_scores, math_scores[:,np.newaxis]).sum(axis=1)
freq = np.equal(math_scores,math_scores[:,np.newaxis]).sum(axis=1)
percentile_col = (count + (0.5*freq))*100/data_size

scores_with_percentile = np.stack((math_scores, percentile_col), axis=1)
print(scores_with_percentile)

[[51. 35.]
[61. 60.]
[45. 15.]
[72. 75.]
[78. 85.]
[61. 60.]
[84. 95.]
[50. 25.]
[42. 5.]
[57. 45.]]

关于python - 百分位计算 : Can I convert this for loop to a vector operation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59507933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com