通过移动其他元素从numpy数组中删除子矩阵

Removing submatrix from numpy array by shifting other elements

假设我有一个 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 替换空白位置。我该怎么做?

您只需将这些元素条目更新为零即可。

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

a[2:, 2:] = 0

returns

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

我找不到能满足您要求的函数,但是将 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]])