Обновлять numy для каждого индекса на основе предыдущего индекса - PullRequest
0 голосов
/ 23 ноября 2018

Есть ли векторизованный способ обновления каждого произвольного индекса в массиве-пустышке на основе индексов до него?Например, в псевдокоде, если у меня есть матрица

1 2 3
3 1 4
1 3 2

И для каждого индекса (i, j) я хочу сделать:

m[i,j] += max(m[i, j-1], m[i-1, j])

Теперь я знаю, что могуделайте это итеративно, но я хочу знать, есть ли векторизованный способ сделать это, так как это было бы более эффективно, чем снова и снова выводить его из пустотелого пространства данных.

Кроме того, я знаю, что этопроблема размещения забора, так как m [0, 0] не имеет предыдущего элемента.Это легко исправить, добавив в матрицу дополнительную строку и столбец с нулями.

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Вы можете использовать numpy.roll для создания сдвинутых версий матрицы:

m += np.maximum(np.roll(m, 1, axis=0), np.roll(m, 1, axis=1))

Это создает две новые копии.Нулевое заполнение требуется, потому что при броске заново вводятся элементы, которые «катятся» за границу:

p = np.pad(m, [(1, 1), (1, 1)], 'constant')
m += np.maximum(np.roll(p, 1, axis=0), np.roll(p, 1, axis=1))[1:-1, 1:-1]
0 голосов
/ 24 ноября 2018

Вот способ, которым вы могли бы векторизовать его:

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

arr_A = np.roll(arr, 1, axis=0)
arr_B = np.roll(arr, 1, axis=1)

max_val = np.maximum(arr_A, arr_B)

output = arr + max_val
>>> [[4 5 5]
     [7 4 7]
     [4 4 6]]

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

>>> [[ 4  6  9] # Output after updating the matrix in each loop.
     [ 7  8 13]
     [ 8 11 15]]

Если вы ищете алгоритм подобного типа, а не пытаетесь восстановить этот точный вывод, тогда np.roll() должно работатьчтобы ускорить процесс.

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