#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數組中沿給定軸的一階差分
#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數組中沿給定軸的一階差分
是的,這恰恰是一種循環numpy元素操作。你只需要學習採取正確的數組片。
x = numpy.arange(10)
y = numpy.zeros(x.shape)
y[1:] = x[1:] - x[:-1]
print y
y = [item - x[i - 1] for i, item in enumerate(x[1:])]
如果您需要訪問一個項目的索引,而遍歷它,enumerate()
是Python的方式。此外,在這種情況下,列表理解更具可讀性。
此外,你不應該使用野生進口(from numpy import *
)。它總是會導入超過您的需要並導致不必要的含糊。相反,只需import numpy
或導入您需要的內容,例如
from numpy import arange, zeros
什麼:
diff(x)
# array([1, 1, 1, 1, 1, 1, 1, 1, 1])
幾個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])
下面是我用了很多的同時,將圖案:
from itertools import izip
d = [a-b for a,b in izip(x[1:],x[:-1])]
沒有回答`y == [1,...,1]`? :) – Elalfer 2011-01-29 04:12:10