Избегайте циклов, чтобы ускорить время вычислений с NumPy - PullRequest
0 голосов
/ 06 октября 2019

Я работаю с матрицей 1800 x 900. Для каждой ячейки в матрице мне нужно выполнить аналогичную операцию, которую можно описать на примере:

a1b1 a1b2 a1b3 .... a1b900
a2b1 a2b2 ..
.
a1800b1 ... ...   ..a1800b900

Для каждой ячейки в новой матрице я хочу, чтобы ее значение было эквивалентносумма его верхнего левого, верхнего и верхнего правого соседа. Итак, я хочу a2b2 = a1b1 + a1b2 + a1b3. Для верхнего ряда это может быть то же значение, что и текущая ячейка.

Я могу легко сделать это, используя 2 для циклов, но есть ли способ, которым я могу векторизовать это так, чтобы это ускорило весь процесс?

Ответы [ 2 ]

0 голосов
/ 06 октября 2019

Вы можете векторизовать его, как показано ниже

arr = np.arange(16).reshape(4,4)

arr2 = np.pad(arr, [(1,0), (1,1)], mode="constant")[:-1, :]

result = arr+arr2[:,0:-2]+arr2[:,1:-1]+arr2[:,2:]

Описание

  • np.pad(arr, [(1,0), (1,1)], mode="constant") нули для пэдов слева, справа и сверху матрицы. index [: -1,:] удалит последнюю строку, эффективно сместив матрицу на одну строку
  • arr2[:,0:-2], arr2[:,1:-1], arr2[:,2:] даст верхний левый, верхний и верхний правый элемент для каждого соответствующего элемента arr. Если элемента нет, выдается 0 (нули дополняются на предыдущем шаге)

Результат

## arr
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

## result
array([[ 0,  1,  2,  3],
       [ 5,  8, 12, 12],
       [17, 24, 28, 24],
       [29, 40, 44, 36]])
0 голосов
/ 06 октября 2019

Использование:

m = your_matrix

m_t = your_matrix (с удаленными нулями сверху и последней строкой)

m_tl = m_t (с левым столбцом все нули ипоследний удаленный столбец)

m_tr = m_t (с удаленным правым столбцом все нули и первый столбец)

m_new = m_t + m_tl + m_tr

, затем измените верхнюю частьвернуться к старым значениям

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