Создайте матрицу, содержащую 1, если в правом нижнем углу есть 1

#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. Именно то, что я искал, спасибо за этот подробный ответ !