正在寻找一种基于另一个数组调整一个数组值的方法?

时间:2016-10-06 07:10:03

标签: python arrays numpy indexing

我从一组双变量数据开始。我的目标是首先在该数据集中找到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]

2 个答案:

答案 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)