当前位置:   article > 正文

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

一列数据的差分和有几个

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

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

  • 一阶前向差分:下一个值与当前值的差
    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(xk1)
  • 一阶中心差分:下一个值与上一个值的差除以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(xk1)

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

  • 二阶前向差分:
    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 )
    f(xk)=f(xk+1)f(xk)=(f(xk+2)f(xk+1))(f(xk+1)f(xk))=f(xk+2)+f(xk)2f(xk+1)
    f(xk)=f(xk+1)f(xk)=(f(xk+2)f(xk+1))(f(xk+1)f(xk))=f(xk+2)+f(xk)2f(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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

初始数据: [ 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)
  • 1

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

np.diff(f, append=-1)
  • 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
  • 4
  • 5
  • 6
  • 7

初始数据:
[[-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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

数据: [ 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])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

计算数据:
[[ 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)
  • 1
  • 2

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/434024
推荐阅读
相关标签
  

闽ICP备14008679号