使用循环删除数组中的不同行

Delete the different rows in array with a loop

我有一个包含多行的 numpy 数组,我想删除索引为 0、1、2 和 6 的行 +0、6+1、6+2 和 2 * 6+0、2 * 6 +1,和 2 * 6+2,和 ... c * 6+0,c * 6+1,c * 6+2。我知道可以使用 np.delete,但是我不知道如何遍历不同的索引。这是一个例子:

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

我想要的输出是:

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

您可以过滤掉它们,而不是删除它们:

out = a[~np.isin(np.arange(len(a))%6, [0,1,2])]

输出:

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

这是一种廉价的方法。我合并 6 行的集合,删除左半部分,然后恢复形状:

>>> a = np.array([[4, 5],    [4, 2],    [1, 2],    [2, 3],    [3, 1],    [0, 1],    [1, 1],    [1, 0],    [1, 5],    [5, 4],    [2, 3],    [5, 5]])
>>> a.shape
(12, 2)
>>> a.reshape((-1,12))
array([[4, 5, 4, 2, 1, 2, 2, 3, 3, 1, 0, 1],
       [1, 1, 1, 0, 1, 5, 5, 4, 2, 3, 5, 5]])
>>> a.reshape((-1,12))[:,6:]
array([[2, 3, 3, 1, 0, 1],
       [5, 4, 2, 3, 5, 5]])
>>> a.reshape((-1,12))[:,6:].reshape(-1,2)
array([[2, 3],
       [3, 1],
       [0, 1],
       [5, 4],
       [2, 3],
       [5, 5]])
>>>

reshape 调用很便宜,因此唯一的成本是选择列子集。