2011-01-29 59 views
10
#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循环。有什么建议么?NumPy数组中沿给定轴的一阶差分

+0

没有回答`y == [1,...,1]`? :) – Elalfer 2011-01-29 04:12:10

回答

5

是的,这恰恰是一种循环numpy元素操作。你只需要学习采取正确的数组片。

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

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

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

如果您需要访问一个项目的索引,而遍历它,enumerate()是Python的方式。此外,在这种情况下,列表理解更具可读性。

此外,你不应该使用野生进口(from numpy import *)。它总是会导入超过您的需要并导致不必要的含糊。相反,只需import numpy或导入您需要的内容,例如

from numpy import arange, zeros 
8

什么:

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

几个NumPy的内置命令将做的工作 - 特别是差异,ediff1d梯度

我怀疑ediff1d是用于OP描述的特定铸造更好的选择 - 沿着即,第一阶差分 - 不同于其他两个,ediff1d被acdtually定向/仅限于这种特定的情况下使用单轴(或一维阵列的轴)。

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

下面是我用了很多的同时,将图案:

from itertools import izip

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