def original_loopy_app(a, b):
    for j in range(shift.size):
        b = np.roll(b, shift[j], axis=0)
a += b

def vectorized_app(a, b):
    n = b.shape[0]
idx = n - 1 - np.mod(shift.cumsum()[:, (None)] - 1 - np.arange(n), n)
a += b[idx].sum(0)

def modified_loopy_app(a, b):
    n = b.shape[0]
b_ext = np.row_stack((b, b[:-1]))
start_idx = n - 1 - np.mod(shift.cumsum() - 1, n)
for j in range(start_idx.size):
    a += b_ext[start_idx[j]:start_idx[j] + n]
Есть ли более быстрый способ добавить два двумерных массива numpy