mars.tensor.diff#

mars.tensor.diff(a, n=1, axis=-1)[来源]#

沿着给定轴计算第 n 个离散差分。

第一个差异由 out[n] = a[n+1] - a[n] 在给定轴上给出,通过递归使用 diff 计算更高的差异。

Parameters
  • a (array_like) – 输入张量

  • n (int, 可选) – 差分值的次数。如果为零,输入将原样返回。

  • axis (int, 可选) – 计算差异的轴,默认是最后一个轴。

Returns

diff – 第 n 阶差异。输出的形状与 a 相同,除了在 axis 方向上,维度减小了 n。输出的类型与 a 中任意两个元素之间的差异类型相同。在大多数情况下,这与 a 的类型相同。一个显著的例外是 datetime64,它会导致输出张量为 timedelta64

Return type

张量

另请参阅

gradient, ediff1d, cumsum

备注

布尔张量的类型被保留,因此当连续元素相同时,结果将包含False,当它们不同时时,结果将包含True

对于无符号整数张量,结果也将是无符号的。这不应该令人惊讶,因为结果与直接计算差值是一致的:

>>> import mars.tensor as mt
>>> u8_arr = mt.array([1, 0], dtype=mt.uint8)
>>> mt.diff(u8_arr).execute()
array([255], dtype=uint8)
>>> (u8_arr[1,...] - u8_arr[0,...]).execute()
255

如果这不是所期望的,那么数组应该首先转换为更大的整数类型:

>>> i16_arr = u8_arr.astype(mt.int16)
>>> mt.diff(i16_arr).execute()
array([-1], dtype=int16)

示例

>>> x = mt.array([1, 2, 4, 7, 0])
>>> mt.diff(x).execute()
array([ 1,  2,  3, -7])
>>> mt.diff(x, n=2).execute()
array([  1,   1, -10])
>>> x = mt.array([[1, 3, 6, 10], [0, 5, 6, 8]])
>>> mt.diff(x).execute()
array([[2, 3, 4],
       [5, 1, 2]])
>>> mt.diff(x, axis=0).execute()
array([[-1,  2,  0, -2]])
>>> x = mt.arange('1066-10-13', '1066-10-16', dtype=mt.datetime64)
>>> mt.diff(x).execute()
array([1, 1], dtype='timedelta64[D]')