按唯一出现次数的顺序重估 numpy 数组

revalue numpy array by order of unique appearance count

我有 2D numpy 数组,我需要通过唯一出现次数来重估数组。

import numpy as np
arr = np.array([[6, 1, 8, 5, 3],
      [2, 7, 3, 6, 9],
      [5, 3, 2, 4, 4],
      [6, 4, 6, 4, 4]])
values, counts = np.unique(arr, return_counts=True)
print('values',values)
print('counts',counts)
values [1 2 3 4 5 6 7 8 9]
counts [1 2 3 5 2 4 1 1 1]

[1, 6],
[2, 4],
[3, 3],
[4, 1],
[5, 5],
[6, 2],
[7, 7],
[8, 8],
[9, 9]

如果有多个 unique 具有相同的外观,最小的 unique 排在第一位,在此示例中,只要有一个,就应将其替换为 6,应将 2 替换为 4,将 3 保留为 3,将 4 替换为1、5留5、6变2,以此类推。

我有 10000*10000 的数组和大约 8000 个唯一数组,因此不能手动进行,应该很快。

如果是有问题同值的顺序不一定是从小到大一定要和正确的主顺序一致,也就是说2可以转5,5可以转4

我认为这给出了预期的结果。稳定排序确保最小值排在第一位,以防多个唯一值具有相同的计数。

values, inverse, counts = np.unique(arr, return_inverse=True, return_counts=True)
order = np.argsort(-counts, kind='stable')
new_values = np.empty_like(values)
new_values[order] = np.arange(1, 1+len(values))
result = new_values[inverse].reshape(arr.shape)