Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用numpy数组中的nan替换异常大的值_Python_Arrays_Numpy_Replace_Nan - Fatal编程技术网

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