使用 `np.diff` 但假设输入以额外的零开头

blu*_*uss 7 python numpy

给定一系列事件时间v,我可以使用np.diff(v). 有没有办法np.diff假设系列以隐式开头0.,以便它生成一个与 长度相同的数组v

手动解决方法是:

def diff_from_zero(v):
    return np.diff(np.hstack(([0.], v)))
Run Code Online (Sandbox Code Playgroud)

有没有办法使用diff或其他函数来获得相同的结果?

Mat*_*ina 12

截至 2019 年,np.diff有参数prepend并且append可以在微分之前向数组添加某个值。查看文档

这会将第一个值附加到数组中,因此该diff操作将返回一些以 0 开头的 len(t)。

>>> t = np.array([1.1, 2.0, 4.5, 4.9, 5.2])
>>> np.diff(t, prepend=t[0])
array([0. , 0.9, 2.5, 0.4, 0.3])
Run Code Online (Sandbox Code Playgroud)

prepend参数可以采用其他值。


blu*_*uss 6

举个例子:

t = np.array([1.1, 2.0, 4.5, 4.9, 5.2])
Run Code Online (Sandbox Code Playgroud)

我们要计算 中的连续差异t,包括从0.到 中第一个元素的差异t

这个问题给出了实现这一点的方式:

>>> np.diff(np.hstack((0, t)))
Run Code Online (Sandbox Code Playgroud)

它也可能是这样的:

>>> np.hstack((t[0], np.diff(t)))
Run Code Online (Sandbox Code Playgroud)

但是这个名字晦涩的函数ediff1d可以在一个函数调用中完成:

>>> np.ediff1d(t, to_begin=t[0])
array([ 1.1,  0.9,  2.5,  0.4,  0.3])
Run Code Online (Sandbox Code Playgroud)

当然t[0],预先准备结果与计算差异相同t[0] - 0.。(假设t为非空)。


时间(不是问题的动机,但我很好奇)

import numpy as np
t = np.random.randn(10000)
%timeit np.diff(np.concatenate(([0], t)))
10000 loops, best of 3: 23.1 µs per loop
%timeit np.diff(np.hstack((0, t)))
10000 loops, best of 3: 31.2 µs per loop
%timeit np.ediff1d(t, to_begin=t[0])
10000 loops, best of 3: 92 µs per loop
Run Code Online (Sandbox Code Playgroud)