你如何索引python中的异常值?

时间:2017-09-19 00:03:00

标签: python python-3.x numpy machine-learning outliers

我试图从python中的列表中删除异常值。我想从原始列表中获取每个异常值的索引值,以便将其从(另一个)相应列表中删除。

~~简单的例子~~

我的异常值列表:

y = [1,2,3,4,500] #500 is the outlier; has a index of 4

我的相应清单:

x= [1,2,3,4,5] #I want to remove 5, has the same index of 4

我的结果/目标:

y=[1,2,3,4]

x=[1,2,3,4]

这是我的代码,我想用klist和avglatlist

实现相同的目标
import numpy as np

klist=['1','2','3','4','5','6','7','8','4000']
avglatlist=['1','2','3','4','5','6','7','8','9']


klist = np.array(klist).astype(np.float)      
klist=klist[(abs(klist - np.mean(klist))) < (2 * np.std(klist))]

indices=[]
for k in klist:
    if (k-np.mean(klist))>((2*np.std(klist))):
        i=klist.index(k)
        indices.append(i)

print('indices'+str(indices))

avglatlist = np.array(avglatlist).astype(np.float) 


for index in sorted(indices, reverse=True):
    del avglatlist[index]


print(len(klist))
print(len(avglatlist))

2 个答案:

答案 0 :(得分:0)

你真的很亲密。您需要做的就是将相同的过滤方式应用于avglatlist的numpy版本。为清楚起见,我更改了一些变量名称。

import numpy as np

klist = ['1', '2', '3', '4', '5', '6', '7', '8', '4000']
avglatlist = ['1', '2', '3', '4', '5', '6', '7', '8', '9']


klist_np = np.array(klist).astype(np.float)
avglatlist_np = np.array(avglatlist).astype(np.float)    

klist_filtered = klist_np[(abs(klist_np - np.mean(klist_np))) < (2 * np.std(klist_np))]
avglatlist_filtered = avglatlist_np[(abs(klist_np - np.mean(klist_np))) < (2 * np.std(klist_np))]

答案 1 :(得分:0)

  

如何获取列表中每个异常值的索引值?

假设异常值定义为平均值的2个标准偏差。这意味着您想知道列表中zscores的绝对值大于2的值的索引。

我会使用 np.where

import numpy as np
from scipy.stats import zscore

klist = np.array([1, 2, 3, 4, 5, 6, 7, 8, 4000])
avglatlist = np.arange(1, klist.shape[0] + 1)

indices = np.where(np.absolute(zscore(klist)) > 2)[0]
indices_filter = [i for i,n in enumerate(klist) if i not in indices]
print(avglatlist[indices_filter])

如果您实际上不需要知道索引,请使用布尔掩码

import numpy as np
from scipy.stats import zscore

klist = np.array([1, 2, 3, 4, 5, 6, 7, 8, 4000])
avglatlist = np.arange(1, klist.shape[0] + 1)

mask = np.absolute(zscore(klist)) > 2
print(avglatlist[~mask])

两种解决方案都打印出来:

[1 2 3 4 5 6 7 8]