我的列表中有随机数量的整数和/或浮点数。我要实现的目标是在我的数字中找到例外(希望使用正确的词来解释这一点)。例如:
list = [1, 3, 2, 14, 108, 2, 1, 8, 97, 1, 4, 3, 5]
我的问题是,这些值可能一直不同。常规范围可能在1.000到1.200之间,例外范围在50万之间。
是否有过滤这些特殊数字的功能?
答案 0 :(得分:0)
您可以使用内置的filter()
方法:
lst1 = [1, 3, 2, 14, 108, 2, 1, 8, 97, 1, 4, 3, 5]
lst2 = list(filter(lambda x: x > 5,lst1))
print(lst2)
输出:
[14, 108, 8, 97]
答案 1 :(得分:0)
假设您的列表为l
:
如果您知道要过滤某个百分比/分位数,则可以 使用:
这将删除底部的10%和顶部的90%。当然,您可以更改 将它们设置为所需的截止值(例如,您可以删除底部的过滤器,而仅过滤示例中顶部的90%):
import numpy as np
l = np.array(l)
l = l[(l>np.quantile(l,0.1)) & (l<np.quantile(l,0.9))].tolist()
输出:
[ 3 2 14 2 8 4 3 5]
如果不确定百分位数截止点,并希望 删除异常值:
您可以通过调整以下参数中的参数m
来调整离群值
函数调用。它越大,除去的离群值越少。与其他离群值去除技术相比,此功能对于各种离群值似乎更健壮。
import numpy as np
l = np.array(l)
def reject_outliers(data, m=6.):
d = np.abs(data - np.median(data))
mdev = np.median(d)
s = d / (mdev if mdev else 1.)
return data[s < m].tolist()
print(reject_outliers(l))
输出:
[1, 3, 2, 14, 2, 1, 8, 1, 4, 3, 5]
答案 2 :(得分:-1)
所以这是一种方法来阻止那些偏离的人
import math
_list = [1, 3, 2, 14, 108, 2, 1, 8, 97, 1, 4, 3, 5]
def consts(_list):
mu = 0
for i in _list:
mu += i
mu = mu/len(_list)
sigma = 0
for i in _list:
sigma += math.pow(i-mu,2)
sigma = math.sqrt(sigma/len(_list))
return sigma, mu
def frequence(x, sigma, mu):
return (1/(sigma*math.sqrt(2*math.pi)))*math.exp(-(1/2)*math.pow(((x-mu)/sigma),2))
sigma, mu = consts(_list)
new_list = []
for i in range(len(_list)):
if frequence(_list[i], sigma, mu) > 0.01:
new_list.append(i)
print(new_list)