如何用NumPy高效计算数组中每个元素对应的百分位数?
用NumPy计算数组元素对应的百分位数
要实现给数组中每个元素返回其对应的百分位数,分以下几种场景高效实现:
场景1:数组已排序且无重复元素
如果你的数组已经是升序排列,且没有重复值,直接利用数组长度生成等间距的百分位数即可:
import numpy as np arrx = np.array([0, 5, 10]) # 生成从0到100的等间距百分位数,数量与数组长度一致 percentiles = np.linspace(0, 100, len(arrx)) print(percentiles) # 输出:[ 0. 50. 100.]
原理:对于长度为n的排序数组,第i个元素(索引从0开始)对应的百分位为i/(n-1)*100,np.linspace会自动生成这个序列。
场景2:数组未排序但无重复元素
如果数组未排序,先通过索引排序映射,再生成百分位数:
import numpy as np arrx = np.array([10, 0, 5]) # 获取数组排序后的索引位置 sorted_indices = np.argsort(arrx) # 生成排序后数组对应的百分位数 sorted_percentiles = np.linspace(0, 100, len(arrx)) # 将百分位数按原数组顺序映射回去 percentiles = np.empty_like(arrx, dtype=float) percentiles[sorted_indices] = sorted_percentiles print(percentiles) # 输出:[100. 0. 50.]
场景3:数组包含重复元素
如果数组有重复值,需要先提取唯一值,再给重复元素分配相同的百分位数:
import numpy as np arrx = np.array([0, 0, 10, 5, 5]) # 获取唯一值及原数组元素对应的唯一值索引 unique_vals, inverse_idx = np.unique(arrx, return_inverse=True) # 给唯一值生成对应的百分位数 unique_percentiles = np.linspace(0, 100, len(unique_vals)) # 映射回原数组,重复元素将获得相同的百分位数 percentiles = unique_percentiles[inverse_idx] print(percentiles) # 输出:[ 0. 0. 100. 50. 50.]
以上方法均基于NumPy原生函数,避免了循环,保证了计算效率。
内容的提问来源于stack exchange,提问作者Edy Bourne
相关产品推荐
相关产品推荐

