Python中如何对仅含字符串的Numpy二维数组按第二列排序?
按Numpy字符串数组的第二列数值排序的解决方法
你遇到的问题根源在于第二列是字符串类型,numpy对字符串数组执行argsort()时会按字典序排序,而非数值序。比如字符串'10'的首字符'1'比'2'小,所以会排在'2'前面,导致排序结果不符合预期。
解决思路是先将第二列的字符串转换为数值类型,再基于数值排序:
import numpy as np # 原数组 x = np.array([ ['0', '0'], ['1', '1'], ['7', '10'], ['8', '11'], [',', '2'], ['4', '3'], ['.', '4'], ['2', '5'], ['5', '6'], ['er014', '7'], ['ww', '8'], ['*', '9']]) # 1. 将第二列字符串转为整数类型 numeric_col2 = x[:, 1].astype(int) # 2. 获取按数值排序的索引 sorted_idx = numeric_col2.argsort() # 3. 用索引对原数组排序 A = x[sorted_idx] # 输出排序结果 print(A)
执行后会得到符合数值排序预期的结果:
[['0' '0'] ['1' '1'] [',' '2'] ['4' '3'] ['.' '4'] ['2' '5'] ['5' '6'] ['er014' '7'] ['ww' '8'] ['*' '9'] ['7' '10'] ['8' '11']]
如果第二列存在无法转换为数值的字符串,可以先过滤或处理异常,但你的案例中第二列均为可转换的数字字符串,所以上述方法完全适用。
内容的提问来源于stack exchange,提问作者kyazgan
相关产品推荐
相关产品推荐

