Удаление подматрицы из массива numpy путем сдвига других элементов

Предположим, у меня есть массив numpy

a = np.array([[1,2,3,4],
              [3,4,5,6],
              [2,3,4,4],
              [3,3,1,2]])

Я хочу удалить подматрицу [[3,4],[3,1]]. Я могу сделать это следующим образом

mask = np.ones(a.shape,dtype=bool)  
mask[2:,1:-1] = False
a_new = a[mask,...]
print(a) #output array([1, 2, 3, 4, 3, 4, 5, 6, 2, 4, 3, 2])

Однако мне нужен вывод как

np.array([[1,2,3,4],
          [3,4,5,6],
          [2,4,0,0],
          [3,2,0,0]])

Я просто хочу, чтобы numpy удалил подматрицу и сдвинул другие элементы, заменив пустые места на 0. Как я могу это сделать?

2 ответа

Решение

Я не могу найти функцию, которая выполняет то, что вы просите, но объединяет np.rollс маской с этой подпрограммой производит ваш вывод. Возможно, есть более изящный способ:

a = np.array([[1,2,3,4],
              [3,4,5,6],
              [2,3,4,4],
              [3,3,1,2]])

mask = np.ones(a.shape,dtype=bool)
mask[2:,1:-1] = False

mask2 = mask.copy()
mask2[2:, 1:] = False
n = 2 #shift length

a[~mask2] = np.roll((a * mask)[~mask2],-n)
a
>>array([[1, 2, 3, 4],
   [3, 4, 5, 6],
   [2, 4, 0, 0],
   [3, 2, 0, 0]])

Вы можете просто обновить эти элементы до нуля.

a = np.array([[1,2,3,4],
              [3,4,5,6],
              [2,3,4,4],
              [3,3,1,2]])

a[2:, 2:] = 0

возвращается

array([[1, 2, 3, 4],
       [3, 4, 5, 6],
       [2, 3, 0, 0],
       [3, 3, 0, 0]])
Другие вопросы по тегам