如何在Numpy计算二维数组每行0.75分位数时排除零值参与运算
方法1:逐行过滤零值计算(全版本兼容,逻辑直观)
直接遍历数组每一行,过滤掉零值后再调用分位数计算函数,适配所有numpy版本:
import numpy as np # 示例数组 arr = np.array([ [5, 3, 2, 0, 0, 1, 6, 9, 11, 1, 4, 1], [0, 0, 12, 0, 1, 0, 0, 2, 0, 30, 2, 2], [120, 2, 10, 3, 0, 0, 2, 7, 9, 5, 0, 0] ]) quantile_075 = [] for row in arr: # 筛选当前行非零值 non_zero_vals = row[row != 0] quantile_075.append(np.quantile(non_zero_vals, 0.75)) print(quantile_075)
以你举的第二行非零值[12,1,2,30,2,2]为例,计算得到的0.75分位数为8.5,符合预期。
方法2:向量化计算(适合大规模数组,性能更高)
如果数组行数很多,循环遍历效率低,可以将零值替换为nan后调用np.nanquantile直接按行计算:
# 零值替换为nan arr_with_nan = np.where(arr != 0, arr, np.nan) # 直接按行计算0.75分位数,自动忽略nan quantile_075 = np.nanquantile(arr_with_nan, 0.75, axis=1)
注:np.nanquantile在numpy 1.15及以上版本可用
掩码数组实现补充
你提到的np.ma模块没有quantile的问题,仅存在于numpy 1.23以下的版本。如果可以升级numpy版本,也可以直接用掩码数组实现:
# 把零值设为掩码 masked_arr = np.ma.masked_equal(arr, 0) quantile_075 = np.ma.quantile(masked_arr, 0.75, axis=1)
内容的提问来源于stack exchange,提问作者Chong Onn Keat
相关产品推荐
相关产品推荐

