如何使用NumPy按指定列数值从高到低排序多维数组
NumPy数组按指定列降序排序问题
我在NumPy文档里没找到对应的用法,来求助。我有这么一个数组(注:原始代码里的Larry、90%写法不符合Python语法,实际要改成字符串和浮点数形式):
import numpy as np X = np.array([ ['Larry', 0.9], ['Beth', 1.0], ['Arnold', 0.9], ])
我想按第二个元素(百分比数值)从高到低排序,期望结果是:
array([['Beth', 1.], ['Arnold', 0.9], ['Larry', 0.9]], dtype='<U6')
我试过用argsort,但下面这段代码根本不起作用:
X = X[-X[:, 0].argsort()]
解决步骤
1. 先改对索引
你之前的代码用了X[:, 0],这是取数组的第一列(名字列),但你要按第二列排序,得改成X[:, 1]才行。
2. 正确实现降序排序
argsort()默认是升序排序,要实现降序有两种简单方法:
- 对升序索引反转:
# 获取第二列的升序索引,反转后得到降序顺序 sorted_idx = X[:, 1].argsort()[::-1] X_sorted = X[sorted_idx]
- 对第二列取负数后再用
argsort:
sorted_idx = (-X[:, 1]).argsort() X_sorted = X[sorted_idx]
3. 保证同分值的原始顺序
如果想让同分值(比如两个90%)保持它们在原数组里的相对顺序(稳定排序),可以用np.lexsort结合原索引:
# 先按第二列降序,再按原数组的索引升序,确保同分值顺序不变 sorted_idx = np.lexsort([np.arange(len(X)), -X[:, 1]]) X_sorted = X[sorted_idx]
这样就能得到你想要的结果:Beth排第一,接着是Arnold、Larry。
内容的提问来源于stack exchange,提问作者Condado
相关产品推荐
相关产品推荐

