如何在NumPy中对二维数组按行计算排除-999的40分位数?
计算二维NumPy数组每行排除指定无效值后的40分位数
给定以下二维NumPy数组,其中-999为无效值,需要计算每行中不等于-999的元素的40分位数:
import numpy as np a = np.array([[-999, 9, 7, 3], [2, 1, -999, 1], [1, 5, 4, 6], [0, 6, -999, 9], [1, -999, -999, 6], [8, 4, 4, 8]])
直接使用np.percentile(a, 40, axis=1)会将-999纳入计算,导致结果被无效值干扰:
array([ 3.8, 1. , 4.2, 1.2, -799. , 4.8])
解决方案:筛选有效元素后计算分位数
通过自定义函数筛选每行的有效元素(排除-999),再用np.apply_along_axis遍历每行计算分位数:
def calc_valid_percentile(row, q=40): # 筛选出当前行中不等于-999的元素 valid_elements = row[row != -999] # 计算有效元素的指定分位数 return np.percentile(valid_elements, q) # 对每行应用自定义函数 result = np.apply_along_axis(calc_valid_percentile, axis=1, arr=a) print(result)
输出结果与预期一致:
array([6.2, 1. , 4.2, 4.8, 1. , 4. ])
补充说明
- 如果需要调整分位数数值,只需修改
q参数即可; - 若无效值不是-999,替换
row != -999中的判断条件即可适配; - 该方法兼容每行有效元素数量不同的场景,无需额外处理长度不一致的问题。
内容的提问来源于stack exchange,提问作者d_frEak
相关产品推荐
相关产品推荐

