如果列表的值超过某个值,则更改它们的值

时间:2013-06-05 15:54:05

标签: python numpy standard-deviation

我正在从文本文件中读取列表并获取此列表的标准偏差,我想知道如何使值超出平均值一个标准偏差以外的值仅用作远离平均值的一个标准偏差。以下是我正在使用的代码的一部分:

a=np.genfromtxt('meanvals2.txt').T[1]
b=np.std(a)
c=np.mean(a)
ok=(a>(c-b))*(a<(c+b)) # within 1st deviation
h=a[ok]
print h

此代码只删除一个标准差以外的任何值。我将如何更改它,以便这些删除的值的上限为1个标准差,远离均值但保留在数据集中?

例如,如果我的列表是[1,2,3,4,5,20],则标准差为7.08,平均值为5.88。所以一个标准偏离平均值是12.96或-1.2,所以当前我的代码将排除任何数字,所以列表将是[1,2,3,4,5],但我希望列表实际读取[ 1,2,3,4,5,12.96。我该怎么做

1 个答案:

答案 0 :(得分:2)

我想我会分两步完成:

a = np.genfromtxt('meanvals2.txt').T[1] 
b = np.std(a)
c = np.mean(a)

#step 1, values lower than 1 std from mean
ok = a > (c - b)
a[~ok] = c - b

#step 2, values higher than 1 std from mean
ok = a < (c + b)
a[~ok] = c + b

print a

当然,如果你真的想要一个单独的数组h,你可以h = a.copy()然后使用h代替a

以您的数据为例:

>>> a = np.array([1,2,3,4,5,20],dtype=np.float32)
>>> b = np.std(a)
>>> c = np.mean(a)
>>> print b
6.46572151487
>>> print c
5.83333333333
>>> ok = a > (c - b)
>>> a[~ok] = c - b
>>> ok = a < (c + b)
>>> a[~ok] = c + b
>>> print a
[  1.          2.          3.          4.          5.         12.2990551]
相关问题