我试图从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))
答案 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]