如果我有像这样的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,具体取决于您计划如何使用二级索引.