Суммирование частично перекрывающихся матриц - PullRequest
0 голосов
/ 13 мая 2018

У меня есть матрицы 3x3, которые могут иметь разные позиции на матрице 5x5, так что эти матрицы 3x3 частично или полностью перекрываются. Наконец, я хочу сложить эти матрицы вместе, чтобы получить окончательную матрицу 5х5. Вот игрушечный пример:

import numpy as np
# I have 3 matrices which partly overlap, defined by their center index
mat1 = np.arange(9).reshape(3,3)
mat2 = np.arange(9).reshape(3,3)+2
mat3 = np.arange(9).reshape(3,3)*2.+1
# I construct 3 empty 5x5 matrices and store my 3x3 matrices there
A = np.zeros((3,5,5))
A[0,0:3,0:3]=mat1
A[1,2:5,2:5]=mat2
A[2,1:4,0:3]=mat3
# Finally I sum the matrices
output = A.sum(0)

По моему мнению, я трачу много памяти и времени на построение матрицы A, если число матриц 3x3 становится большим. Я ищу другой способ, чтобы сложить частично перекрывающиеся матрицы 3х3. Отметим, что позиции (индексы) матриц 3х3 известны.

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Вы можете избежать временного (3,5,5) использования add.at и as_strided:

>>> out = np.zeros((5, 5))
>>> oas = np.lib.stride_tricks.as_strided(out, (3,3,3,3), 2*out.strides)
>>> at = [0,2,1], [0,2,0]
>>> np.add.at(oas, at, (mat1, mat2, mat3))
>>> out
array([[ 0.,  1.,  2.,  0.,  0.],
       [ 4.,  7., 10.,  0.,  0.],
       [13., 16., 21.,  3.,  4.],
       [13., 15., 22.,  6.,  7.],
       [ 0.,  0.,  8.,  9., 10.]])
0 голосов
/ 13 мая 2018

Если для каждой матрицы у вас есть кортеж (offrow, offcol), вы можете создать свой вывод напрямую, перебирая все свои матрицы:

output = np.zeros((5,5))
matrices = [mat1, mat2, mat3]
offsets = [(0, 0), (2, 2), (1, 0)]
for m, o in zip(matrices, offsets):
    for i in range(3):
       for j in range(3):
           output[i + o[0], j + o[1]] += m[i,j]

Это позволяет избежать создания временных матриц 5x5, созданных из матриц 3x3. Это будет занимать меньше памяти, но не может быть быстрее.

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