我从一组双变量数据开始。我的目标是首先在该数据集中找到y值为异常值的点。然后,我想创建一个新的数据集,其中不仅包括离群点,还包括x值在任何给定离群值的0.01之内的任何点。
然后(如果可能的话)我想从新的x-set中减去原始异常值x值,这样我就得到一组x值介于-0.01和0.01之间的点,x值现在指示距原始异常值x值的距离。
我有这段代码:
import numpy as np
mean = np.mean(y)
SD = np.std(y)
x_indices = [i for i in range(len(y)) if ((y[i]) > ((2*SD)+mean))]
expanded_indices = [i for i in range(len(x)) if np.any((abs(x[i] - x[x_indices])) < 0.01)]
这很好用,现在我可以使用索引调用(并绘制)x和y:
plt.plot(x[expanded_indices],y[expanded_indices])
但是,我不知道如何减去原来的“x_indices”值以获得-0.01到0.01的x范围,因为我尝试的所有内容都失败了。
我想做类似下面的事情,除了我知道我不能减去两个不同大小的数组,我担心我不能在这个上下文中使用np.any。
x_values = [(x[expanded_indices] - x[indices]) if np.any((abs(x[expanded_indices] - x[indices])) < 0.01)]
有什么想法吗?对不起,这太久了 - 我对此非常陌生,很丢失。我在过去的几个小时里一直在努力,任何帮助都会受到赞赏。谢谢!
样本数据可能如下: x = [0,0.994,0.995,0.996,0.997,0.998,1.134,1.245,1.459,1.499,1.500,1.501,2.103,2.104,2.105,2.106]
y = [1.5,1.6,1.5,1.6,10,1.5,1.5,1.5,1.6,1.6,1.5,1.6,1.5,11,1.6,1.5]
答案 0 :(得分:0)
一旦你有了y-outliers值的集合和带有扩展值的集合,你就可以用for循环遍历整个第二集合,并使用2 For()
个循环减去相应的第一个设置值:< / p>
import numpy as np
x =np.array([0,0.994,0.995,0.996,0.997,0.998,1.134,1.245,1.459,1.499,1.500,1.501,2.103,2.104,2.105,2.106])
y = np.array([1.5,1.6,1.5,1.6,10,1.5,1.5,1.5,1.6,1.6,1.5,1.6,1.5,11,1.6,1.5])
mean = np.mean(y)
SD = np.std(y)
# elements with y-element outside defined region
indices = [i for i in range(len(y)) if ((y[i]) > ((2*SD)+mean))]
my_1st_set = x[indices]
# Set with values within 0.01 difference with 1st set points
expanded_indices = [i for i in range(len(x)) if np.any((abs(x[i] - x[x_indices])) < 0.01)]
my_2nd_set = x[expanded_indices]
# A final set with the subtracted values from the 2nd set
my_final_set = my_2nd_set
for i in range(my_final_set.size):
for j in range(my_1st_set.size):
if abs(my_final_set[i] - my_1st_set[j]) < 0.01:
my_final_set[i] = x[i] - my_1st_set[j]
break
my_final_set是一个numpy数组,其结果值减去原始的expanded_indices值及其对应的第一组值
答案 1 :(得分:0)
让我们看看我是否理解正确。此代码应找到异常值,并为每个异常值将数组放入res。
import numpy as np
mean = np.mean(y)
SD = np.std(y)
x = np.array([0,0.994,0.995,0.996,0.997,0.998,1.134,1.245,1.459,1.499,1.500,1.501,2.103,2.104,2.105,2.106])
y = np.array([1.5,1.6,1.5,1.6,10,1.5,1.5,1.5,1.6,1.6,1.5,1.6,1.5,11,1.6,1.5])
outlier_indices = np.abs(y - mean) > 2*SD
res = []
for x_at_outlier in x[np.flatnonzero(outlier_indices)]:
part_res = x[np.abs(x - x_at_outlier) < 0.01]
part_res -= np.mean(part_res)
res.append(part_res)
res
现在是一个数组列表,每个数组包含一个异常值周围的值。或许以这种格式继续处理数据会更容易吗?
如果你想要所有这些都在一个numpy数组中:
res = np.hstack(res)