首页 > 解决方案 > 如何获取具有唯一列值的行数(按其他列值分组)?

问题描述

考虑以下数组:

x = np.array([[1, 1],[1, 1], [1, 2], [1, 2], [1, 2],
              [2, 3], [2, 3], [2, 3], [2, 4], [2, 4]])

x
Out[12]: 
array([[1, 1],
       [1, 1],
       [1, 2],
       [1, 2],
       [1, 2],
       [2, 3],
       [2, 3],
       [2, 3],
       [2, 4],
       [2, 4],
       [2, 5],
       [2, 5],
       [2, 5]])

如何获得每个第 1 列值的唯一第 2 列值的数量?

例如:如果可以使用函数 V 完成,则 V(x) = [2, 3]。

我已经使用 for 循环实现了这一点。但是,它似乎比必要的更复杂并且花费了太多时间(当应用于比这个示例大得多的实际数据集时)。

我对性能感兴趣并且愿意为了速度而牺牲代码的清晰度(尽管它们通常是直接相关的!)。

标签: pythonnumpy

解决方案


使用numpy.unique两次:

import numpy as np

x = np.array([[1, 1],[1, 1], [1, 2], [1, 2], [1, 2],
              [2, 3], [2, 3], [2, 3], [2, 4], [2, 4]])

# drop duplicates
xx = np.unique(x, axis=0)

# count the first column
values, counts = np.unique(xx[:,0], return_counts=True)

print(values)
print(counts)

# [1, 2]
# [2, 2]

推荐阅读