关于一维和二维数据的差分和梯度的计算(使用 num.diff() 和 numpy.gradient() )

您所在的位置:网站首页 对数excel怎么计算横向和纵向 关于一维和二维数据的差分和梯度的计算(使用 num.diff() 和 numpy.gradient() )

关于一维和二维数据的差分和梯度的计算(使用 num.diff() 和 numpy.gradient() )

2024-01-19 03:13| 来源: 网络整理| 查看: 265

关于一维数据的差分和梯度的计算

一维数据的差分公式: 一阶差分:

一阶前向差分:下一个值与当前值的差 f ( x k ) = f ( x k + 1 ) − f ( x k ) f(x_k) = f(x_{k+1}) - f(x_k) f(xk​)=f(xk+1​)−f(xk​)一阶后向差分:当前值与上一个值的差 f ( x k ) = f ( x k ) − f ( x k − 1 ) f(x_k) = f(x_k) - f(x_{k-1}) f(xk​)=f(xk​)−f(xk−1​)一阶中心差分:下一个值与上一个值的差除以2 f ( x k ) = f ( x k + 1 ) − f ( x k − 1 ) 2 f(x_k)=\frac{f(x_{k+1}) - f(x_{k-1})}{2} f(xk​)=2f(xk+1​)−f(xk−1​)​

二阶差分: 对一阶前向差分的输出再做一阶前向差分,如:

二阶前向差分: f ′ ′ ( x k ) = f ′ ( x k + 1 ) − f ′ ( x k ) = ( f ( x k + 2 ) − f ( x k + 1 ) ) − ( f ( x k + 1 ) − f ( x k ) ) = f ( x k + 2 ) + f ( x k ) − 2 ∗ f ( x k + 1 ) \begin{aligned} f''(x_k) &= f'(x_{k+1}) - f'(x_k) \\ &=( f(x_{k+2}) - f(x_{k+1}) )- ( f(x_{k+1}) - f(x_k) )\\ &=f(x_{k+2}) + f(x_k) - 2 * f(x_{k+1}) \end{aligned} f′′(xk​)​=f′(xk+1​)−f′(xk​)=(f(xk+2​)−f(xk+1​))−(f(xk+1​)−f(xk​))=f(xk+2​)+f(xk​)−2∗f(xk+1​)​

梯度: 一维数据的梯度就是前后两点的变化率,即一阶中心差分。

差分计算示例(一维数据)

环境: notebook + numpy 1.20.2

import numpy as np f=np.array([0,2,3,6,2,-1]) d1=np.diff(f) d2=np.diff(f,2) print('初始数据:',f) print('一阶差分:',d1) print('二阶差分:',d2)

初始数据: [ 0 2 3 6 2 -1] 一阶差分: [ 2 1 3 -4 -3] 二阶差分: [-1 2 -7 1]

其中:

一阶差分中: 2 = 2 - 0, 1 = 3 - 2, 3 = 6 - 3 …二阶差分中:-1 = 1 - 2, 2 = 3 - 1…

可以看出:

np.diff() 是计算 前向差分输出结果比原数据少一个元素

如要使输出的数据长度与原数据一致,可在最前面增加一个数:

np.diff(f, prepend=-1)

array([ 1, 2, 1, 3, -4, -3]) 在原数据前增加一个数(-1)后,输出结果比不加的多了一个元素(最前面的1,它等于原数据的第一个元素0减增加的元素-1) 可在最后面增加一个数:

np.diff(f, append=-1)

array([ 2, 1, 3, -4, -3, 2])

差分计算示例(二维数据) import numpy as np f=np.array([[-1,2,3,6],[2,4,6,8],[9,2,7,4]]) d1=np.diff(f) # 缺省axis, 按最后一个维度差分,对二维数据来说就是按第二个维度差分 d2=np.diff(f,axis=0) # 按第一个维度差分 print('初始数据:\n',f) print('横向差分:\n',d1) print('纵向差分:\n',d2)

初始数据: [[-1 2 3 6] [ 2 4 6 8] [ 9 2 7 4]] 横向差分: [[ 3 1 3] [ 2 2 2] [-7 5 -3]] 纵向差分: [[ 3 2 3 2] [ 7 -2 1 -4]] 可以看出,横向差分少一列、纵向差分少一行。

梯度计算示例(一维数据) import numpy as np f=np.array([0,2,4,6,4,2,-4.]) g1=np.gradient(f) g2=np.gradient(f,2) # 缩小比例 print('数据:',f) print('梯度:',g1) print('缩小:',g2)

数据: [ 0. 2. 4. 6. 4. 2. -4.] 梯度: [ 2. 2. 2. 0. -2. -4. -6.] 缩小: [ 1. 1. 1. 0. -1. -2. -3.] 其中,输出的第二行,梯度:

第2个元素 = 数据中的第3和第1个元素的差除以2,…;梯度两端的元素可理解为差分

输出的第三行,缩小: 当计算时使用第2个参数,表示缩小尺度,取2表示缩小一半,取0.5表示放大一倍,取-1表示符号取反。

梯度计算示例(二维数据) import numpy as np f=np.array([[0,-2,2,4],[1,3,7,5],[4,2,8,6.]]) d=np.gradient(f) print('计算数据:\n',f) print('纵向梯度:\n',d[0]) print('横向梯度:\n',d[1])

计算数据: [[ 0. -2. 2. 4.] [ 1. 3. 7. 5.] [ 4. 2. 8. 6.]] 纵向梯度: [[ 1. 5. 5. 1.] [ 2. 2. 3. 1.] [ 3. -1. 1. 1.]] 横向梯度: [[-2. 1. 3. 2.] [ 2. 3. 1. -2.] [-2. 2. 2. -2.]] 计算时没指定维度,两个维度的都计算(分纵向和横向); 可用 axis=n 来指定维度:

d=np.gradient(f, axis=1) print('横向梯度:\n',d)

横向梯度: [[-2. 1. 3. 2.] [ 2. 3. 1. -2.] [-2. 2. 2. -2.]]



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3