#python #numpy
#питон #тупица
Вопрос:
Учитывая матрицу M n*n
(содержащую только 0
и 1
), я хочу построить матрицу, содержащую a 1
в положении (i, j)
тогда и только тогда, когда в правой нижней подматрице есть хотя бы 1 M[i:n, j:n]
Пожалуйста, обратите внимание, что я знаю, что существует оптимальный алгоритм для вычисления этого, но по соображениям производительности я ищу решение с использованием numpy (поэтому алгоритм полностью скомпилирован).
Пример:
Учитывая эту матрицу:
0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 1 0 1 0 0
Я ищу способ вычислить эту матрицу:
0 0 0 0 1 0 0 1 1 1 0 0 1 1 1 1 1 1 1 1
Спасибо
Комментарии:
1. каким был бы желаемый результат, если бы матрица состояла из всех нулей (за исключением нижней левой ячейки)? … правильна ли вторая ячейка в нижней строке?
2. В заголовке вашего вопроса написано «внизу справа», в тексте вопроса написано «внизу слева» и
M[i:n, j:n]
подразумевается внизу справа. Что это такое?3. Извините, это была опечатка, я имею в виду внизу справа
4. «Я ищу решение…» Это не совсем то, как работает этот сайт…
5. Эй, @SiHa, не могли бы вы, пожалуйста, просветить меня ? Я действительно не вижу проблемы в своем вопросе
Ответ №1:
Используя numpy, вы можете накапливать максимальное значение по каждой оси:
import numpy as np M = np.array([[0,0,0,0,1], [0,0,1,0,0], [0,0,0,0,1], [1,0,1,0,0]]) M = np.maximum.accumulate(M) M = np.maximum.accumulate(M,axis=1) print(M) [[0 0 0 0 1] [0 0 1 1 1] [0 0 1 1 1] [1 1 1 1 1]]
Примечание: Это соответствует вашему результату примера (наличие 1 в левом верхнем квадранте). Однако ваши объяснения логики приведут к другому результату
Если мы пойдем с M[i:n,j:n]
(внизу справа):
M = np.array([[0,0,0,0,1], [0,0,1,0,0], [0,0,0,0,1], [1,0,1,0,0]]) M = np.maximum.accumulate(M[::-1,:])[::-1,:] M = np.maximum.accumulate(M[:,::-1],axis=1)[:,::-1] print(M) [[1 1 1 1 1] [1 1 1 1 1] [1 1 1 1 1] [1 1 1 0 0]]
По сути, это тот же подход, за исключением обратного накопления на осях
Комментарии:
1. Именно то, что я искал, спасибо за этот подробный ответ !