np.where(arr<0,0,arr)数据替换
np.where(条件, 满足条件时填的值, 不满足条件时填的值)
demo:把数组中小于0的数都替换为0
import numpy as np arr = np.array([-2.5, 3.0, -0.5, 0, 5.5, -1.2, 4.0]) result = np.where(arr < 0, 0, arr) print("处理结果:", result)处理结果: [0. 3. 0. 0. 5.5 0. 4. ]
注意:这俩方法与where差不多
np.clip(arr, 0, None) | 也是单边限制(下限为0),效果完全一样。 |
np.clip(arr, -5, 5) | 双边限制:小于 -5 的变 -5,大于 5 的变 5,中间的保留。 |
where的其他用法:
1、找出数组满足条件的索引:
arr = np.array([10, 25, 30, 15, 28]) # 找出 arr 中大于 20 的数字都在哪个位置 indexes = np.where(arr > 20) print(indexes) # 输出:(array([1, 2, 4]),) -> 意思是下标 1、2、4 的位置满足条件 # 利用这个索引,可以把这些位置的数全部打印出来 print(arr[indexes]) # 输出:[25 30 28]在实际数据清洗中的妙用:如果你想删除所有异常值(而不是替换),你就用单参数where找到好数据的下标,然后筛选出来。
# 假设温度数据,只想要大于0且小于100的正常数据,把异常的丢掉 raw = np.array([36.5, -5, 45.0, 200, 36.6]) normal_indexes = np.where((raw > 0) & (raw < 100)) clean_data = raw[normal_indexes] print(clean_data) # 输出:[36.5 45.0 36.6] (-5 和 200 被丢掉了)2、复合逻辑(且 &,或 |,非 ~)
arr = np.array([-5, 0, 10, 25, 100]) # 条件:大于等于 0 并且 小于等于 50 result = np.where((arr >= 0) & (arr <= 50), arr, -999) # 不满足的设为 -999 print(result) # 输出:[-999 0 10 25 -999]注意:在 NumPy 中,逻辑“与”必须用
&,逻辑“或”用|,千万不能用 Python 的and和or
3、嵌套多条件(实现if...elif...else)
where支持嵌套,用来处理“不止两种情况”的分支。比如:大于 0 的设为 1,等于 0 的设为 0,小于 0 的设为 -1。
arr = np.array([-2, 0, 3]) # 外层判断 >=0 吗?如果是,再进入内层判断是不是等于 0 result = np.where(arr >= 0, np.where(arr == 0, 0, 1), -1) print(result) # 输出:[-1 0 1]如果条件超过 3 个分支,用np.select代码会更清晰
4、结合np.where修改原始数据
where 可以直接放在赋值语句的等号左边(借助单参数模式拿到的索引) arr = np.array([1, 2, 3, 4, 5]) # 找出所有大于3的位置,直接将这些位置上的值改为 100 arr[np.where(arr > 3)] = 100 print(arr) # 输出:[1 2 3 100 100]三个参数造新值,两个参数找位置。
1、看到3 个参数(条件,A,B):它就是“盖浇饭”,满足条件的浇A,不满足的浇B,生成新饭。
2、看到1 个参数(只有条件):它就是“定位器”,只告诉你哪里有金矿(下标),挖不挖随你。
