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

Я бы хотел взять разницу несмежных значений в массиве 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", чтобы начать каждую строку с нуля?

1 Ответ

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

Ничего себе. Я сделал это ... (Это тоже интересная проблема для меня ..)

Я сделал функцию non_adjacent_diff для применения к каждой строке и применил ее к каждой строке, используя np.apply_along_axis.

Попробуйте этот код.

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

def non_adjacent_diff(row):
    not_zero_index = np.where(row != 0)
    diff = row[not_zero_index][1:] - row[not_zero_index][:-1]
    np.put(row, not_zero_index[0][1:], diff)
    return row

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