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

11
#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

上面的代码是有效的,但一定有至少一种简单、Pythonic 的方法可以不使用 for 循环来完成。你有什么建议吗?


1
@Elalfer 我认为他只是举了一个arange()的例子。 - Rafe Kettler
5个回答

10

那么这样怎么样:

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

6
是的,这正是numpy逐元素操作所设计的循环类型。你只需要学会取数组的正确切片即可。
x = numpy.arange(10)
y = numpy.zeros(x.shape)

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

print y

5

几个NumPy内置函数可以完成这项工作 - 特别是diff,ediff1d和gradient

我认为在OP所描述的特定情况下,ediff1d是更好的选择 - 与其他两个不同,ediff1d实际上是针对这个特定用例进行指导/限制的 - 即沿着单个轴(或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])

2
иҝҷжҳҜжҲ‘дёҖж®өж—¶й—ҙз»ҸеёёдҪҝз”Ёзҡ„жЁЎејҸпјҡ
д»ҺitertoolsеҜје…Ҙizip d = [a-b for a,b in izip(x[1:],x[:-1])]

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接