Ответ 1
Да, это точно такой тип циклов, который используется для элементарных операций. Вам просто нужно научиться принимать правильные срезы массивов.
x = numpy.arange(10)
y = numpy.zeros(x.shape)
y[1:] = x[1:] - x[:-1]
print y
#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. Какие-либо предложения?
Да, это точно такой тип циклов, который используется для элементарных операций. Вам просто нужно научиться принимать правильные срезы массивов.
x = numpy.arange(10)
y = numpy.zeros(x.shape)
y[1:] = x[1:] - x[:-1]
print y
Как насчет:
diff(x)
# array([1, 1, 1, 1, 1, 1, 1, 1, 1])
несколько встроенных 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])
Вот шаблон, который я использовал некоторое время:
from itertools import izip
d = [a-b for a,b in izip(x[1:],x[:-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