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

时间:2017-01-26 14:33:36

标签: python numpy

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

手动解决方法是:

def diff_from_zero(v):
    return np.diff(np.hstack(([0.], v)))

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

3 个答案:

答案 0 :(得分:1)

截至2019年,np.diff的参数prependappend可以在微分之前为数组添加一定的值。 See the docs

这会将第一个值附加到数组,因此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])

prepend参数可以采用其他值。

答案 1 :(得分:0)

举个例子:

t = np.array([1.1, 2.0, 4.5, 4.9, 5.2])

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

问题就是通过这种方式实现了这个目标:

>>> np.diff(np.hstack((0, t)))

也可能是这样:

>>> np.hstack((t[0], np.diff(t)))

但是隐含命名的函数ediff1d可以在一个函数调用中执行:

>>> np.ediff1d(t, to_begin=t[0])
array([ 1.1,  0.9,  2.5,  0.4,  0.3])

在结果中预先加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

答案 2 :(得分:0)

Matias 对多于一个轴的数组的回答的跟进:

def np_diff(arr: np.array, axis: int):
    return np.diff(
        arr, 
        axis=axis, 
        prepend=np.expand_dims(np.take(arr, 0, axis=axis), axis=axis)
    )