Python 用numpy数组中的nan替换异常大的值
我从一个数据文件中得到了下面的一列,我正试图绘制它Python 用numpy数组中的nan替换异常大的值,python,arrays,numpy,replace,nan,Python,Arrays,Numpy,Replace,Nan,我从一个数据文件中得到了下面的一列,我正试图绘制它 [ 2.21 2.34 2.56 2.78 180. 3.32 4.57 2.89 286. 2.46 3.76 4.89 10.13] 因此,在我的数据集中,有时我的值会急剧增加,比如(2.781803.32)和(2.89286246)。我想用np.nan替换这个异常值。我试图输入这样一个条件[如果x(I)>5(x(I-1)+x(I+1)),那么x(I)=np.nan]
[ 2.21 2.34 2.56 2.78 180. 3.32 4.57 2.89 286.
2.46 3.76 4.89 10.13]
因此,在我的数据集中,有时我的值会急剧增加,比如(2.781803.32)和(2.89286246)。我想用np.nan替换这个异常值。我试图输入这样一个条件[如果x(I)>5(x(I-1)+x(I+1)),那么x(I)=np.nan],这意味着每当x的第I个值(x是列值)远大于其上一个和下一个值时,python将用np.nan替换该值,这样就不会绘制或考虑它。
但我还没能把它转换成编码格式。任何帮助都会很有帮助
import numpy as np
data=np.loadtxt('/Users/Hrihaan/Desktop/Data.txt')
x=data[:,1]
print(x)
条件x(i)>5(x(i-1)+x(i+1))
可以测试i=1,…,n-1
,其中n
是x
的最大允许指数。
对所有i
s测试此条件的矢量化版本为:
mask = (x[1:-1] > 5*(x[2:]+x[:-2]))
然后,您可以使用以下命令将np.nan
分配到掩码为真的位置:
x[1:-1][mask] = np.nan
请注意,x[1:-1]
是一个——这很重要,因为切片(与通过所谓的方法获得的数组相反)是原始数组的视图,x
。因此,修改视图x[1:-1]
会影响原始数组x
。因此,分配给x[1:-1][mask]
不仅会影响切片x[1:-1]
,还会影响x
本身
使用布尔掩码进行索引将调用高级索引,该索引返回一个新数组(而不是视图)。因此,相比之下,赋值x[mask][1:-1]=np.nan
不起作用,因为修改x[mask]
不会影响x
本身。(由于更普通的原因,mask
是错误的长度,它也不起作用。)
让我们试一试:
import numpy as np
x = np.array([ 2.21, 2.34, 2.56, 2.78, 180., 3.32, 4.57, 2.89, 286., 2.46, 3.76, 4.89, 10.13])
mask = (x[1:-1] > 5*(x[2:]+x[:-2]))
# array([False, False, False, True, False, False, False, True, False,
# False, False], dtype=bool)
x[1:-1][mask] = np.nan
print(x)
# array([ 2.21, 2.34, 2.56, 2.78, nan, 3.32, 4.57, 2.89,
# nan, 2.46, 3.76, 4.89, 10.13])
为了更好地理解(x[1:-1]>5*(x[2:+x[:-2])
请看一个简化的示例:
In [57]: x = np.arange(8); x
Out[57]: array([0, 1, 2, 3, 4, 5, 6, 7])
x[2://code>从x
中切掉前两项:
In [58]: x[2:]
Out[58]: array([2, 3, 4, 5, 6, 7])
In [59]: x[:-2]
Out[59]: array([0, 1, 2, 3, 4, 5])
In [60]: x[1:-1]
Out[60]: array([1, 2, 3, 4, 5, 6])
x[:-2]
从x
中切掉最后两项:
In [58]: x[2:]
Out[58]: array([2, 3, 4, 5, 6, 7])
In [59]: x[:-2]
Out[59]: array([0, 1, 2, 3, 4, 5])
In [60]: x[1:-1]
Out[60]: array([1, 2, 3, 4, 5, 6])
x[1:-1]
来自x
的第一个和最后一个项目的切片:
In [58]: x[2:]
Out[58]: array([2, 3, 4, 5, 6, 7])
In [59]: x[:-2]
Out[59]: array([0, 1, 2, 3, 4, 5])
In [60]: x[1:-1]
Out[60]: array([1, 2, 3, 4, 5, 6])
NumPy算法是按元素执行的。所以(x[2:+x[:-2])
计算x(i-1)+x(i+1)
对于i=1,…,n-1
:
In [61]: (x[2:]+x[:-2])
Out[61]: array([ 2, 4, 6, 8, 10, 12])
所以我们有这样的情况:
| i | x(i-1) | x(i+1) | x(i) |
|-----+--------+--------+--------|
| 1 | x(0) | x(2) | x(1) |
| 2 | x(1) | x(3) | x(2) |
| 3 | x(2) | x(4) | x(3) |
| ... | | | |
| n-1 | x(n-1) | x(n) | x(n-1) |
|-----+--------+--------+--------|
^ ^ ^
| | |
| | o--- This column is the array x[1:-1]
| |
| o------------ This column is the array x[2:]
|
o--------------------- This column is the array x[:-2]
另一种方法是:一旦知道条件是i=1,…,n-1
,那么x(i)
显然变成x[1:-1]
,因为它从索引1开始,在最后一个可能的索引之前结束1个索引。
接下来,x(i-1)
和x(i+1)
可以被认为是x(i)
左右的元素。因此,我们处理的是x[1:-1]
左移一个索引,右移一个索引。
因此,将x[1:-1]
向右移动一个索引会产生x[2:
,将x[1:-1]
向左移动一个索引会产生x[:-2]
顺便说一下,其中一个
Python的半开片语法是x[a:b]
具有(b-a)
元素。所以
x[1:-1]
(相当于x[1:n-1]
)具有n-2
元素。注意到
由于缺少2个元素,因此很容易猜测相邻的数组
x[1:-1]
是x[2:
和x[:-2]
条件x(i)>5(x(i-1)+x(i+1))
可以测试i=1,…,n-1
,其中n
是x
的最大允许索引。
对所有i
s测试此条件的矢量化版本为:
mask = (x[1:-1] > 5*(x[2:]+x[:-2]))
然后,您可以使用以下命令将np.nan
分配到掩码为真的位置:
x[1:-1][mask] = np.nan
请注意,x[1:-1]
是一个——这很重要,因为切片(与通过所谓的方法获得的数组相反)是原始数组的视图,x
。因此,修改视图x[1:-1]
会影响原始数组x
。因此,分配给x[1:-1][mask]
不仅会影响切片x[1:-1]
,还会影响x
本身
使用布尔掩码进行索引将调用高级索引,该索引返回一个新数组(而不是视图)。因此,相比之下,赋值x[mask][1:-1]=np.nan
不起作用,因为修改x[mask]
不会影响x
本身。(由于更普通的原因,mask
是错误的长度,它也不起作用。)
让我们试一试:
import numpy as np
x = np.array([ 2.21, 2.34, 2.56, 2.78, 180., 3.32, 4.57, 2.89, 286., 2.46, 3.76, 4.89, 10.13])
mask = (x[1:-1] > 5*(x[2:]+x[:-2]))
# array([False, False, False, True, False, False, False, True, False,
# False, False], dtype=bool)
x[1:-1][mask] = np.nan
print(x)
# array([ 2.21, 2.34, 2.56, 2.78, nan, 3.32, 4.57, 2.89,
# nan, 2.46, 3.76, 4.89, 10.13])
为了更好地理解(x[1:-1]>5*(x[2:+x[:-2])
请看一个简化的示例:
In [57]: x = np.arange(8); x
Out[57]: array([0, 1, 2, 3, 4, 5, 6, 7])
x[2://code>从x
中切掉前两项:
In [58]: x[2:]
Out[58]: array([2, 3, 4, 5, 6, 7])
In [59]: x[:-2]
Out[59]: array([0, 1, 2, 3, 4, 5])
In [60]: x[1:-1]
Out[60]: array([1, 2, 3, 4, 5, 6])
x[:-2]
从x
中切掉最后两项:
In [58]: x[2:]
Out[58]: array([2, 3, 4, 5, 6, 7])
In [59]: x[:-2]
Out[59]: array([0, 1, 2, 3, 4, 5])
In [60]: x[1:-1]
Out[60]: array([1, 2, 3, 4, 5, 6])
x[1:-1]
来自x
的第一个和最后一个项目的切片:
In [58]: x[2:]
Out[58]: array([2, 3, 4, 5, 6, 7])
In [59]: x[:-2]
Out[59]: array([0, 1, 2, 3, 4, 5])
In [60]: x[1:-1]
Out[60]: array([1, 2, 3, 4, 5, 6])
NumPy算法是按元素执行的。所以(x[2:+x[:-2])
计算x(i-1)+x(i+1)
对于i=1,…,n-1
:
In [61]: (x[2:]+x[:-2])
Out[61]: array([ 2, 4, 6, 8, 10, 12])
所以我们有这样的情况:
| i | x(i-1) | x(i+1) | x(i) |
|-----+--------+--------+--------|
| 1 | x(0) | x(2) | x(1) |
| 2 | x(1) | x(3) | x(2) |
| 3 | x(2) | x(4) | x(3) |
| ... | | | |
| n-1 | x(n-1) | x(n) | x(n-1) |
|-----+--------+--------+--------|
^ ^ ^
| | |
| | o--- This column is the array x[1:-1]
| |
| o------------ This column is the array x[2:]
|
o--------------------- This column is the array x[:-2]
另一种方法是:一旦知道条件是i=1,…,n-1
,那么x(i)
显然变成x[1:-1]
,因为它从索引1开始,在最后一个可能的索引之前结束1个索引。
接下来,x(i-1)
和x(i+1)
可以被认为是x(i)
左右的元素。因此,我们处理的是x[1:-1]
左移一个索引,右移一个索引。
因此,将x[1:-1]
向右移动一个索引会产生x[2:
,将x[1:-1]
向左移动一个索引会产生x[:-2]
顺便说一下,其中一个
Python的半开片语法是x[a:b]
具有(b-a)
元素。所以
x[1:-1]
(相当于x[1:n-1]
)具有n-2