Я бы хотел взять разницу несмежных значений в массиве 2D numpy вдоль axis=-1
(на строку). Массив может состоять из большого количества строк.
Каждая строка представляет собой набор значений по временной шкале от 1 до N
.
Для N=12
массив может выглядеть следующим образом ниже 3x12
форма:
timeline = np.array([[ 0, 0, 0, 4, 0, 6, 0, 0, 9, 0, 11, 0],
[ 1, 0, 3, 4, 0, 0, 0, 0, 9, 0, 0, 12],
[ 0, 0, 0, 4, 0, 0, 0, 0, 9, 0, 0, 0]])
Требуемый результат должен выглядеть следующим образом: (размер массива не поврежден и позиция важна)
diff = np.array([[ 0, 0, 0, 4, 0, 2, 0, 0, 3, 0, 2, 0],
[ 1, 0, 2, 1, 0, 0, 0, 0, 5, 0, 0, 3],
[ 0, 0, 0, 4, 0, 0, 0, 0, 5, 0, 0, 0]])
Мне известно о решении в 1D , Различаются несмежные значения
imask = np.flatnonzero(timeline)
diff = np.zeros_like(timeline)
diff[imask] = np.diff(timeline[imask], prepend=0)
, в пределах которых последняя строка может быть заменена на
diff[imask[0]] = timeline[imask[0]]
diff[imask[1:]] = timeline[imask[1:]] - timeline[imask[:-1]]
, а первая строка может быть заменена на
imask = np.where(timeline != 0)[0]
Попытка обобщить решение 1D
, которое я вижу, imask = np.flatnonzero(timeline)
нежелательна, поскольку строки становятся взаимозависимыми. Таким образом, я пытаюсь использовать альтернативу np.nonzero
.
imask = np.nonzero(timeline)
diff = np.zeros_like(timeline)
diff[imask] = np.diff(timeline[imask], prepend=0)
Однако это решение приводит к связи между конечными значениями строки (взаимозависимыми).
array([[ 0, 0, 0, 4, 0, 2, 0, 0, 3, 0, 2, 0],
[-10, 0, 2, 1, 0, 0, 0, 0, 5, 0, 0, 3],
[ 0, 0, 0, -8, 0, 0, 0, 0, 5, 0, 0, 0]])
Как можно Я делаю "prepend", чтобы начать каждую строку с нуля?