разности первого порядка вдоль заданной оси в массиве NumPy - PullRequest
10 голосов
/ 29 января 2011
#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. Какие-либо предложения?

Ответы [ 5 ]

9 голосов
/ 29 января 2011

А как же:

diff(x)
# array([1, 1, 1, 1, 1, 1, 1, 1, 1])
5 голосов
/ 29 января 2011

несколько встроенных NumPy будут выполнять эту работу - в частности, diff, ediff1d и Градиент .

я подозреваю, ediff1d - лучший выбор для конкретного приведения, описанного в OP - в отличие от двух других, 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])
5 голосов
/ 29 января 2011

Да, именно для этого предназначен цикл поэлементных поэлементных операций.Вам просто нужно научиться брать правильные кусочки массивов.

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

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

print y
2 голосов
/ 29 января 2011

Вот шаблон, который я часто использовал некоторое время:

from itertools import izip

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

1 голос
/ 29 января 2011
y = [item - x[i - 1] for i, item in enumerate(x[1:])]

Если вам нужно получить доступ к индексу элемента во время его циклического просмотра, enumerate() - это путь Pythonic.Кроме того, понимание списка в этом случае более читабельно.

Более того, вы никогда не должны использовать дикий импорт (from numpy import *).Он всегда будет импортировать больше, чем нужно, и приведет к ненужной неопределенности.Скорее просто import numpy или импортируйте то, что вам нужно, например

from numpy import arange, zeros
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...