Numpy做差分时考虑第一行(和最后一行)
通过np.diff()可以实现对np.array求差分。以一阶差分为例,直接调用np.diff()得到的结果是后一个值减去前一个值,并没有考虑第一位的值,差分后的维度会比原数据少1,如下所示:
import numpy as np
import random
ar = np.random.randint(20, size=(5,4))
ar
Out[36]:
array([[ 7, 8, 17, 14],
[14, 17, 18, 17],
[ 9, 1, 11, 17],
[17, 17, 16, 19],
[18, 12, 6, 14]])
# 对每行差分
ar_row_diff = np.diff(ar,axis=0)
ar_row_diff
Out[37]:
array([[ 7, 9, 1, 3],
[ -5, -16, -7, 0],
[ 8, 16, 5, 2],
[ 1, -5, -10, -5]])
# 对每列差分
ar_col_diff = np.diff(ar,axis=1)
ar_col_diff
Out[38]:
array([[ 1, 9, -3],
[ 3, 1, -1],
[-8, 10, 6],
[ 0, -1, 3],
[-6, -6, 8]])
从以上算例可以看出,对行求差分时,ar_row_diff比ar少一行,对列求差分时,ar_col_diff比ar少一列。如果想要差分后的数据维度和原矩阵一样,即第一行(列)也减去一组什么数,可以通过prepend参数实现如下。
# Case 1
ar_row_diff = np.diff(ar,axis = 0,prepend=ar[-1:,:])
ar_row_diff
Out[40]:
array([[-11, -4, 11, 0],
[ 7, 9, 1, 3],
[ -5, -16, -7, 0],
[ 8, 16, 5, 2],
[ 1, -5, -10, -5]])
# Case 2
ar_col_diff = np.diff(ar,axis = 1,prepend=ar[:,0:1])
ar_col_diff
Out[42]:
array([[ 0, 1, 9, -3],
[ 0, 3, 1, -1],
[ 0, -8, 10, 6],
[ 0, 0, -1, 3],
[ 0, -6, -6, 8]])
其中Case 1是对行求差分,ar_row_diff的第一行为ar的第一行减去最后一行;Case 2是对列求差分,ar_col_diff的第一列为ar的第一列减去它本身。
可以看出,当我想要在求差分时让第一行(列)也减去某组值时,可以将该值赋给prepend参数。