如何排序含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
相关产品推荐
相关产品推荐

