Python 使用numpy.argwhere删除异常值

Python 使用numpy.argwhere删除异常值,python,python-3.x,list,numpy,numpy-slicing,Python,Python 3.x,List,Numpy,Numpy Slicing,嘿,伙计们,这个问题可能更多的是关于逻辑而不是代码,希望有人能把它点亮。 因此,我有一个包含一些异常值的数据列表,我想通过使用列表中每个项目之间的差异并确定差异太大的地方来删除它。 在本例中,我想从数据列表中删除索引[2,3,4]。最好的方法是什么?? 我曾尝试使用np.argwhere()方法来查找索引,但是,我一直在研究如何使用它的结果来分割np.array??? data=[4.0, 4.5, 22.5, 40.5, 22.5, 3.5, 3.0, 3.5, 4.5, 3.5, 2.5]

嘿,伙计们,这个问题可能更多的是关于逻辑而不是代码,希望有人能把它点亮。
因此,我有一个包含一些异常值的数据列表,我想通过使用列表中每个项目之间的差异并确定差异太大的地方来删除它。
在本例中,我想从数据列表中删除索引[2,3,4]。最好的方法是什么??
我曾尝试使用np.argwhere()方法来查找索引,但是,我一直在研究如何使用它的结果来分割np.array???

data=[4.0, 4.5, 22.5, 40.5, 22.5, 3.5, 3.0, 3.5, 4.5, 3.5, 2.5]
data=np.array(data)
d = data[:-1] - data[1:]
print(np.mean(d)) 
在本例中,当我打印差异(d)时,它会返回以下内容:

print(d) # returns:[ -0.5 -18.  -18.   18.   19.    0.5  -0.5  -1.    1.    1. ]
那很好。现在,我应用的逻辑是指出,在d中,我们有一个比原始数据的平均值高的数字

x = np.argwhere(d>np.mean(data))
print(x)        # returns: array([3], dtype=int64), array([4], dtype=int64)
indices_to_extract = [x[0]-1,x[-1]]
print(indices_to_extract)      # returns: [array([2], dtype=int64), array([[4]], dtype=int64)]
a1 = np.delete(r,indices_to_extract,axis=0)
print(a1)       #returns: [ 4.   4.5 40.5  3.5  3.   3.5  4.5  3.5  2.5]


 #Desirable return:
[ 4.   4.5 3.5  3.  3.5  4.5  3.5  2.5]

主要问题是,如何从np.argwhere()的数字范围中得出可用于切片的结果???

获取列表项之间的差异的问题是,例如,索引为1(4.5)的值将被视为异常值(其差异值较高)。此外,在计算差分时,您还可以同时获得正值和负值,因此,如果您希望以这种方式进行计算,则应在差分结果上应用模块(
abs

发现异常值的方法如下:

计算z分数:

d = (data - np.mean(data)) / np.std(data)
从数据中选择除异常值(75%分位数以上)以外的所有值:

输出:

array([4. , 4.5, 3.5, 3. , 3.5, 4.5, 3.5, 2.5])
要对一系列数字使用
np.argwhere()
,请在本例中使用
[3,20]

x = np.argwhere((data<20) & (data>3))

我建议使用中位数的标准化距离,这更可靠:

d = np.abs(data - np.median(data))
mdev = np.median(d)
s = d / (mdev if mdev else 1.)
print(data[s < 4])

快速提问,~对代码做了什么?以前从未见过??这是否定的,所以所有的真变假,反之,这是一个如何用这种方法去除异常值的问题,还是去除异常值的最佳方法?因为有比简单距离更好的方法来检测异常值。
data[np.where(data<20)]
data[np.where((data<20)&(data>3))]
d = np.abs(data - np.median(data))
mdev = np.median(d)
s = d / (mdev if mdev else 1.)
print(data[s < 4])
[4.  4.5 3.5 3.  3.5 4.5 3.5 2.5]