请考虑下面的 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]])