基于order与run双关键字对numpy字符串数组排序
嘿,这事儿好办!我帮你实现这个先按order数值排序、再按run数值排序的需求,两种方法任你选~
解决方案
我们的核心思路是:先从每个文件名里提取出order和run的整数数值,然后以order为第一排序优先级,run为第二优先级进行排序。
方法一:用Numpy原生的lexsort(适合大规模数组场景)
Numpy的lexsort函数专门用来处理多键排序,它会先按最后一个传入的键排序,再往前依次处理,正好匹配我们的需求:
import numpy as np fns = np.array(["filename_0004_0003_info.hdf5", "filename_0003_0003_info.hdf5", "filename_0001_0001_info.hdf5", "filename_0002_0001_info.hdf5", "filename_0006_0002_info.hdf5", "filename_0005_0002_info.hdf5"]) # 从每个文件名中提取order和run的整数 orders = np.array([int(fn.split('_')[2]) for fn in fns]) runs = np.array([int(fn.split('_')[1]) for fn in fns]) # 用lexsort获取排序索引:先按order(主要键),再按run(次要键) sorted_indices = np.lexsort((runs, orders)) # 根据索引对原数组排序 sorted_fns = fns[sorted_indices] # 输出结果 print(sorted_fns)
运行后会得到符合要求的排序结果:
['filename_0001_0001_info.hdf5' 'filename_0002_0001_info.hdf5' 'filename_0005_0002_info.hdf5' 'filename_0006_0002_info.hdf5' 'filename_0003_0003_info.hdf5' 'filename_0004_0003_info.hdf5']
方法二:用Python内置sorted函数(逻辑更直观)
如果你更习惯Python列表的操作方式,可以用sorted函数配合自定义排序键,代码可读性更高:
import numpy as np fns = np.array(["filename_0004_0003_info.hdf5", "filename_0003_0003_info.hdf5", "filename_0001_0001_info.hdf5", "filename_0002_0001_info.hdf5", "filename_0006_0002_info.hdf5", "filename_0005_0002_info.hdf5"]) # 定义排序键:返回(order, run)元组,sorted会先比较order,再比较run def sort_key(filename): parts = filename.split('_') run = int(parts[1]) order = int(parts[2]) return (order, run) # 排序后转回Numpy数组 sorted_fns = np.array(sorted(fns, key=sort_key)) # 输出结果 print(sorted_fns)
这个方法的输出和上面完全一致,逻辑上更易懂,适合小规模数组或者需要灵活调整排序规则的场景。
内容的提问来源于stack exchange,提问作者The Dude
相关产品推荐
相关产品推荐

