删除复制其他数组行的已定义列元素的数组行



请考虑下面的 np 数组示例:

import numpy as np
arr = np.array([[1,2,5,  4,2,7,  5,2,9],
[4,4,1,  4,2,0,  3,6,4],
[1,2,1,  4,2,2,  5,2,0],
[1,2,7,  2,4,1,  5,2,8],
[1,2,9,  4,2,8,  5,2,1],
[4,2,0,  4,4,1,  5,2,4],
[4,4,0,  4,2,6,  3,6,6],
[1,2,1,  4,2,2,  5,2,0]])

问题:我们只关注每个元素三元组的前两列。 我想删除复制每个三元组的这两个元素的数组行(以相同的顺序)。

在上面的示例中,索引为 0、2、4 和 7 的行都是[1,2,_, 4,2,_, 5,2,_]的形式。 所以,我们应该保留arr[0],并放弃其他三个。 类似地,row[6]被删除,因为它与 row[1] 具有相同的模式,即[4,4,_, 4,2,_, 3,6,_]。 在给出的示例中,输出应如下所示:

[[1,2,5,  4,2,7,  5,2,9],
[4,4,1   4,2,0,  3,6,4],
[1,2,7,  2,4,1,  5,2,8],
[4,2,0,  4,4,1   5,2,4]]

我最挣扎的部分是解决方案应该足够通用,可以处理 3、6、9、12... 列的数组。(始终是 3 的倍数,我们总是对每个三元组的前两列的重复感兴趣。

如果您可以创建一个仅包含您感兴趣的值的数组,则可以将其传递给具有return_index选项的np.unique()

。获取所需组的一种方法是每隔三列删除一次。将其传递给np.unique()并获取索引:

import numpy as np
arr = np.array([[1,2,5,  4,2,7,  5,2,9],
[4,4,1,   4,2,0,  3,6,4],
[1,2,1,  4,2,2,  5,2,0],
[1,2,7,  2,4,1,  5,2,8],
[1,2,9,  4,2,8,  5,2,1],
[4,2,0,  4,4,1,   5,2,4],
[4,4,0,  4,2,6,  3,6,6],
[1,2,1,  4,2,2,  5,2,0]])

unique_cols = np.delete(arr, slice(2, None, 3), axis=1)
vals, indices = np.unique(unique_cols, axis=0, return_index=True)
arr[sorted(indices)]

输出:

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

最新更新