给定一系列事件时间v
,我可以使用np.diff(v)
创建其间隔持续时间。有没有办法让np.diff
假设系列以隐式0.
开头,以便它生成一个与v
长度相同的数组?
手动解决方法是:
def diff_from_zero(v):
return np.diff(np.hstack(([0.], v)))
有没有办法使用diff
或其他函数来获得相同的结果?
答案 0 :(得分:1)
截至2019年,np.diff
的参数prepend
和append
可以在微分之前为数组添加一定的值。 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)
)