python – 如何获取二维数组中指定列的唯一行索引

如果我有像这样的numpy索引….

import numpy as np

a = np.array([
    [0, 0],
    [0, 1],
    [1, 0],
    [1, 1],
])

如何找到一个或多个指定列中的值唯一的行的索引?我的意思是……如果我将列指定为“掩码”,我如何使用该列作为掩码找到唯一的行?例如,如果我想……

相对于列0的唯一行(第0列是掩码).我想要这样的回报….

[[0,1],[2,3]]

因为如果要使用列0作为唯一性的标准,则行0和1将位于相同的“唯一组”中,而行2和3将位于另一个“唯一组”中,因为它们在列0中具有相同的值.

如果我想要相对于第1列(第1列现在是掩码)的行,我希望有这样的输出….

[[0,2],[1,3]]

因为使用第1列作为唯一性标准会导致行0和2以及第1行和第3行位于各自独立的组中,因为它们在第1列中具有相同的值

我还希望能够获得关于多个列的唯一行所以如果我想要关于列0和1的唯一行(现在列0和1都是掩码),我希望这个返回.. ..

[[0],[1],[2],[3]]

因为当您使用两列作为唯一性标准时,有四个唯一的行.

在numpy中有一个简单的方法吗?谢谢.

最佳答案 这是一个自定义解决方案,当然不会非常高效,因为它会进行大量复制并直接遍历矩阵:

def groupby(a, key_columns):
    from collections import defaultdict
    groups = defaultdict(list)
    for i, row in enumerate(a):
        groups[tuple(row[c] for c in key_columns)].append(i)
    return groups.values()

这假设key_columns是一个列表或元组,其中包含您有兴趣进行分组的相应列.您还可以执行一些参数检查并将单个索引提升为单个列表.

运行以下示例会产生以下输出:

>>> groupby(a, [0])
[[0, 1], [2, 3]]
>>> groupby(a, [1])
[[0, 2], [1, 3]]

它也适用于您问的多个键列:

>>> groupby(a, [0, 1])
[[1], [2], [0], [3]]

请注意,在这种情况下,由于使用了defaultdict,因此无法保证值的顺序.您可以对结果值进行排序,也可以使用collections.OrderedDict,具体取决于您计划如何使用二级索引.

点赞