条件x(i)>5(x(i-1)+x(i+1)) 可以测试i = 1,...,n-1,其中n 是x 的最大允许索引。
为所有is 测试此条件的矢量化版本将是:
mask = (x[1:-1] > 5*(x[2:]+x[:-2]))
然后您可以使用以下方法将np.nan 分配给mask 为True 的位置:
x[1:-1][mask] = np.nan
注意x[1:-1] 是slice of x——这很重要,因为切片(与通过所谓的"advanced indexing" 获得的数组相反)是原始数组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:] 从x 中切掉前两项:
In [58]: x[2:]
Out[58]: array([2, 3, 4, 5, 6, 7])
x[:-2] 从x 中切掉最后两项:
In [59]: x[:-2]
Out[59]: array([0, 1, 2, 3, 4, 5])
x[1:-1]x 中第一个和最后一个项目的切片:
In [60]: x[1:-1]
Out[60]: array([1, 2, 3, 4, 5, 6])
NumPy 算术以元素方式执行。所以(x[2:]+x[:-2]) 为i=1,...,n-1 计算x(i-1)+x(i+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]。
顺便说一句,beautiful
properties 之一
Python 的半开切片语法是 x[a:b] 有 (b-a) 元素。所以
x[1:-1](相当于x[1:n-1])具有n-2 元素。注意到
有 2 个缺失的元素可以很容易地猜出相邻的数组
x[1:-1] 是 x[2:] 和 x[:-2]。