2011-01-29 20 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 

上記のコードは機能しますが、forループを使用せずにこれを行うには、少なくとも1つの簡単な方法が必要です。助言がありますか?NumPy配列の指定された軸に沿った一次差分

+0

は 'Y == [1、...、1]'ではないでしょうか? :) – Elalfer

+1

@Elalfer彼は例として 'arange()'を使っていると思います。 –

答えて

5

はい、これは正確に、numpyのelementwise操作のために設計されたループの種類です。あなたは配列の正しいスライスを取ることを学ぶ必要があります。

についてどう
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の組み込み関数は、仕事をする - 特に、diffは、、および勾配をediff1d。

私はediff1dはOPに記載されている特定のキャストのためのより良い選択である疑いがある - 他の二つと違って、ediff1dがacdtually向けられている/この特定のユースケースに限定 - に沿って、すなわち、一次違い単一軸(または1次元配列の軸)。ここで

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

関連する問題