如何用Numpy筛选处于均值±标准差区间内的数组元素
解决Numpy数组区间筛选问题
原始数据与已有计算
首先定义目标数组,并完成加权均值、标准差的计算:
import numpy as np lycop = np.array([[14, 15, 16, 17, 18, 19, 20, 21, 22, 23], [1, 1, 8, 24, 48, 58, 35, 16, 8, 1]]) # 加权均值 lycop_media = (lycop[0]*lycop[1]).sum()/lycop[1].sum() # 结果为18.83 # 标准差(注意:原代码中**1/2是错误写法,正确应为**0.5或np.sqrt,这里按已得到的1.09555计算) lycop_std = 1.09555
已成功生成两个区间的数组:
# 筛选小于均值-标准差的元素 a1 = lycop[0][(lycop[0] < (lycop_media - lycop_std))] # 输出:array([14, 15, 16, 17]) # 筛选大于均值+标准差的元素 a2 = lycop[0][(lycop[0] > (lycop_media + lycop_std))] # 输出:array([20, 21, 22, 23])
正确生成区间内数组a3
要筛选满足μ−σ < d < μ+σ的元素,直接用布尔索引组合两个条件即可,无需多余的列表包裹或手动指定数值:
# 计算区间上下限 lower = lycop_media - lycop_std upper = lycop_media + lycop_std # 筛选处于区间内的元素 a3 = lycop[0][(lycop[0] > lower) & (lycop[0] < upper)]
执行后得到结果:array([18, 19]),完全符合需求。
错误原因说明
- 第一次尝试的条件逻辑错误,写成了
(lycop[0] < 均值-标准差) & (lycop[0] < 均值+标准差),实际应该是大于下限且小于上限;同时无需用np.where再套列表,直接用布尔索引即可提取元素。 - 第二次尝试手动指定18、19,属于硬编码,无法适应数据变化,不是通用解法。
内容的提问来源于stack exchange,提问作者Mesjenet
相关产品推荐
相关产品推荐

