通过移动其他元素从 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 替换空白位置。我该怎么做?

我找不到可以按照您的要求执行的函数,但是将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]])

最新更新