NumPy数组中沿给定轴的一阶差分

时间:2011-01-29 04:04:27

标签: python arrays numpy

#compute first differences of 1d array
from numpy import *

x = arange(10)
y = zeros(len(x))

for i in range(1,len(x)):
    y[i] = x[i] - x[i-1]
print y

上面的代码有效,但必须至少有一种简单,pythonesque的方法来做到这一点,而不必使用for循环。有什么建议?

5 个答案:

答案 0 :(得分:9)

怎么样:

diff(x)
# array([1, 1, 1, 1, 1, 1, 1, 1, 1])

答案 1 :(得分:5)

是的,这正是为那种循环numpy元素操作而设计的。你只需要学会采用正确的数组切片。

x = numpy.arange(10)
y = numpy.zeros(x.shape)

y[1:] = x[1:] - x[:-1]

print y

答案 2 :(得分:5)

几个NumPy内置函数将完成这项工作 - 尤其是 diff,ediff1d gradient

我怀疑 ediff1d 是OP中描述的特定演员的更好选择 - 与其他两个不同,ediff1d特别针对/限于此特定用例--ie,沿单个轴(或1D阵列的轴)的一阶差分。

>>> import numpy as NP
>>> x = NP.random.randint(1, 10, 10)
>>> x
  array([4, 6, 6, 8, 1, 2, 1, 1, 5, 4])

>>> NP.ediff1d(x)
  array([ 2,  0,  2, -7,  1, -1,  0,  4, -1])

答案 3 :(得分:2)

这是我经常使用的模式:

from itertools import izip

d = [a-b for a,b in izip(x[1:],x[:-1])]

答案 4 :(得分:1)

y = [item - x[i - 1] for i, item in enumerate(x[1:])]

如果您需要在循环时访问项目的索引,enumerate()是Pythonic方式。此外,在这种情况下,列表理解更具可读性。

此外,您绝不应该使用野生导入(from numpy import *)。它将始终导入超过您需要的内容,并导致不必要的歧义。相反,只需import numpy或导入您需要的内容,例如

from numpy import arange, zeros