Удаление подматрицы из массива 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]])