合并来自多个 numpy.uniques 的计数

Combine counts from multiple numpy.uniques

我有 多个 returns of numpy.unique(a, return_counts=True) 不幸的是 not 可以访问原始数组。我想将这些结果组合到一个具有唯一值的数组和一个存储各自计数的数组中。 我不想使用 np.repeat() 反向创建数组,因为这些数据对我的 RAM 来说太大了。

我还找到了 Python 的 collection.Counter,但由于我将结果用作 numpy 数组,所以我更愿意留在 numpy 的“内部”。 (除了,你会建议我这样做吗?)

有没有有效的方法来解决这个问题?

我想要这样的东西,不使用 np.repeat():

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

values_ravel = multi_unique_values.ravel()
counts_ravel = multi_unique_counts.ravel()

np.unique(np.repeat(values_ravel,counts_ravel), return_counts=True)

> (array([1, 2, 3, 4]), array([5, 7, 9, 7]))

我可以使用 for 循环实现我想要的结果,但我正在寻找一种(快得多)的方法!

all_unique_values, indices_ = np.unique(values_ravel, return_inverse=True)

all_unique_counts = np.zeros(all_unique_values.shape)

for count_index, unique_index in enumerate(indices_):
    all_unique_counts[unique_index] += counts_ravel[count_index]
    
(all_unique_values, all_unique_counts)
> (array([1, 2, 3, 4]), array([5., 7., 9., 7.]))

您可以简单地应用 np.unique 来获取具有所有唯一值的数组,并同时获取排序数组中每个项目的位置。然后可以根据之前的索引累加item个数,得到合并后的item个数。

all_unique_values, index = np.unique(multi_unique_values, return_inverse=True)
all_unique_counts= np.zeros(all_unique_values.size, np.int64)
np.add.at(all_unique_counts, index, multi_unique_counts.ravel())  # inplace
all_unique_counts