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

如何排序含float与int类型的Numpy数组?C++开发者技术问询

搞定Numpy结构化数组的排序问题

嘿,我来帮你解决这个排序需求!首先先提个小细节:你当前创建的arr是二维结构化数组(shape为(200,2)),但从你的代码逻辑来看,你应该是想做一个包含200个元素的一维结构化数组——每个元素自带dist(浮点型)和type(整型)两个字段,对应你说的“2列”。如果是这样的话,创建数组时可以调整成更直观的写法:

dtype = [('dist', float), ('type', int)]
arr = np.zeros(200, dtype=dtype)  # 这里shape是(200,),而非(200,2)

这样每个arr[i]就直接包含两个字段,后续赋值和排序都会更顺手,比如赋值可以改成:

i = 0
for current_image in all_images:
    arr[i]['dist'] = distance(current_image, new_image)
    arr[i]['type'] = 1 if current_image[576] == 1 else 0
    i += 1

接下来回到核心的排序问题,针对结构化数组,Numpy提供了非常灵活的排序方式,主要通过order参数指定排序依据的字段:

1. 按单个字段排序

按dist字段升序排序(默认升序)

可以直接用数组的sort()方法做原地排序:

arr.sort(order='dist')

或者用np.sort()生成新的排序后数组(不修改原数组):

sorted_arr = np.sort(arr, order='dist')

按dist字段降序排序

如果需要降序,先升序排序后反转数组即可(仅mergesort支持结合order的稳定排序,适合后续反转):

# 原地降序排序
arr.sort(order='dist', kind='mergesort')
arr = arr[::-1]

# 生成新的降序数组
sorted_arr_desc = np.sort(arr, order='dist', kind='mergesort')[::-1]

按type字段排序

把order参数换成'type'就行:

arr.sort(order='type')  # 按type值升序排列

2. 按多个字段复合排序

如果需要先按type分组,再在每组内按dist排序,直接给order传字段列表即可:

# 先按type升序,type相同的元素再按dist升序
arr.sort(order=['type', 'dist'])

# 如果需要先按type降序,再按dist升序,可以先排序后调整顺序
arr.sort(order=['type', 'dist'], kind='mergesort')
# 把type为1的元素移到前面
arr = np.concatenate([arr[arr['type'] == 1], arr[arr['type'] == 0]])

如果你要保留二维结构化数组的排序

如果你确实需要维持(200,2)的shape,比如想按某一列的字段排序整个数组,可以指定轴参数:

# 按每一行第一个元素的dist字段,对整个二维数组做行排序
arr.sort(axis=0, order=['dist'])

这样不管是哪种场景,都能轻松搞定排序啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:13:50