You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用np.unique()按指定顺序排序分类变量的唯一值?

问题:如何让np.unique()按指定顺序返回分类变量的唯一值?

我尝试用以下代码获取分类变量的唯一值并按指定顺序排序,但没成功:

import numpy as np

unique_values, unique_value_counts = np.unique(['Small', 'Medium', 'Large', 'Medium', 'Small', 'Large', 'Small', 'Medium'], return_counts = True)

print(unique_values)

代码输出:

['Large', 'Medium', 'Small']

但我期望得到按Small、Medium、Large顺序排列的结果:

['Small', 'Medium', 'Large']

请问是否可以通过np.unique()实现该排序需求?


解答

np.unique()默认按字典序排序返回结果,所以会得到['Large', 'Medium', 'Small']。该函数本身没有直接指定自定义排序规则的参数,但可以结合其他步骤实现需求:

方法1:利用有序分类类型(推荐)

借助pandas.Categorical定义自定义顺序,再传入np.unique()处理:

import numpy as np
import pandas as pd

# 指定目标顺序
custom_order = ['Small', 'Medium', 'Large']
# 将原始数组转为有序分类
categorical_arr = pd.Categorical(
    ['Small', 'Medium', 'Large', 'Medium', 'Small', 'Large', 'Small', 'Medium'],
    categories=custom_order,
    ordered=True
)
# 获取唯一值和计数
unique_vals, counts = np.unique(categorical_arr, return_counts=True)
print(unique_vals)

输出:

['Small' 'Medium' 'Large']

方法2:手动映射排序

如果不想依赖pandas,可以先获取默认结果,再按自定义顺序重新提取:

import numpy as np

custom_order = ['Small', 'Medium', 'Large']
original_arr = ['Small', 'Medium', 'Large', 'Medium', 'Small', 'Large', 'Small', 'Medium']

# 获取默认去重后的结果和计数
unique_vals, counts = np.unique(original_arr, return_counts=True)
# 构建值与计数的映射
val_count_map = dict(zip(unique_vals, counts))
# 按自定义顺序生成结果
sorted_vals = np.array(custom_order)
sorted_counts = np.array([val_count_map[val] for val in custom_order])

print(sorted_vals)
print(sorted_counts)

输出:

['Small' 'Medium' 'Large']
[3 3 2]

补充说明

np.unique()的核心逻辑是去重后执行默认字典序排序,没有内置自定义排序的参数。上述两种方法都能基于np.unique()的能力实现自定义顺序需求,其中方法1更贴合分类变量的处理场景,代码更简洁。


内容的提问来源于stack exchange,提问作者user3046211

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 20:03:17