Вы можете использовать два кумулятивных максимальных вызова:
from np.mx import maximum as mx
mx.<b>accumulate(</b>mx.<b>accumulate(</b>A<b>)</b>, axis=1<b>)</b>
mx.accumulate
вычисляет кумулятивный максимум. Это означает, что для axis=0
значение для B = накапливать (A) таково, что b ij = max k≤j a ик . Для axis=1
то же самое происходит, но по столбцам.
Делая это два раза, мы знаем, что для результата R значение для r ij будет максимумом r ij = max k≤i, l≤ j a kl .
Действительно, если такой самый большой элемент существует в этом под прямоугольнике, то первый mx.accumulate(..)
скопирует это значение вправо и, таким образом, в конечном итоге в тот же столбец, что и «цель». Затем следующий mx.accumulate(.., axis=1)
скопирует это значение в ту же строку, что и «target», и, таким образом, передаст это значение в правильную ячейку.
Для данного примера ввода мы получим:
>>> A
array([[1, 2, 1, 1],
[1, 1, 6, 5],
[3, 2, 4, 2]])
>>> mx.accumulate(mx.accumulate(A), axis=1)
array([[1, 2, 2, 2],
[1, 2, 6, 6],
[3, 3, 6, 6]])
Тесты : если мы запустим вышеупомянутый алгоритм для случайной матрицы 1000 × 1000 и повторим эксперимент 100 раз, мы получим следующий тест:
>>> timeit(lambda: mx.accumulate(mx.accumulate(A), axis=1), number=100)
1.5123104000231251
Таким образом, это означает, что он вычисляет одну такую матрицу приблизительно за 151 миллисекунду.