Numpy: разница между несмежными значениями - PullRequest
1 голос
/ 21 апреля 2020

Я бы хотел взять разницу несмежных значений в массиве 1D numpy.

Массив - это выбор значений по временной шкале от 1 до N.

Для N=12 массив может выглядеть следующим образом:

timeline = np.array([ 0, np.nan, np.nan, 4, np.nan, 6, np.nan, np.nan, 9, np.nan, 11, 12]) 

или

timeline = np.array([ 0,  0,  0,  4,  0,  6,  0,  0,  9,  0, 11, 12])

Требуемый результат должен выглядеть следующим образом: (размер массива не поврежден, а положение важно )

diff = np.array([ 0,  0,  0,  4,  0,  2,  0,  0,  3,  0, 2, 1])

np.diff возвращает разницу смежных значений, и использование значений NaN, чтобы «заставить» его использовать последнее «хорошее» значение, не работает.

Есть ли простой способ сделать это?

1 Ответ

2 голосов
/ 21 апреля 2020

Использовать списки индексов. Я предполагаю, что вы хотите оставить первое значение как есть.

Для пробелов без нуля:

imask = np.flatnonzero(timeline)
diff = np.zeros_like(timeline)
diff[imask[0]] = timeline[imask[0]]
diff[imask[1:]] = timeline[imask[1:]] - timeline[imask[:-1]]

Или, что более элегантно, заменить две последние строки на:

diff[imask] = np.diff(timeline[imask], prepend=0)

Для nan s просто замените первую строку на

imask = np.flatnonzero(~np.isnan(timeline))

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

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