numpy 对二维数组按某行或某列排序问题

2022-03-03 18:55:44 +08:00
 LeeReamond

需求:以某行或某列为 key ,对列或行顺序进行整体平移, 例如以下矩阵

[[1.2, 0.5, 0.1, 0.9],
 [  3,   5,   8,   6]]

如果以首行为 key ,期望获得结果为

[[0.1, 0.5, 0.9, 1.2],
 [  8,   5,   6,   3]]

使用代码是 np.argsort()

import numpy as np
d = np.array([[1.2,0.5,0.1,0.9],[3,5,8,6]], dtype=np.float32)
print(d)
print(d[0])
print(np.argsort(d[0]))

### output:
[[1.2 0.5 0.1 0.9]
 [3.  5.  8.  6. ]]
[1.2 0.5 0.1 0.9]
[2 1 3 0]

其中 argsort 结果不正确,如果 argsort 输出结果是标号,那么应该输出[3,1,0,2]才对,印象里以前用 numpy 排序就是 argsort 搞的,这次知道为啥用不对了,有无大佬帮看一眼。

另问一下逆序排序的办法,stackoverflow 上说用 np.fliplr()反转结果,感觉不太对啊

2396 次点击
所在节点    Python
3 条回复
disk
2022-03-03 19:32:09 +08:00
重新排序,直接传入需要顺序的切片就行了。
argsort 结果没问题,你搞错功能了,标号指定是元素下标不是排名号
necomancer
2022-03-04 02:20:17 +08:00
1. 按行排列,用 argsort 以第一行排的话 a[:, np.argsort(a[0])]
2. 按列排行,用 argsort 以第二列排的话 a[np.argsort(a.T[1]),:]
3. 逆序排序好像挺反人类的,arr[::-1].sort() 会原位逆序排序(即 id(arr) 和先 arr[::-1].sort()再 id(arr) 会一样)。但如果用 argsort,得 np.argsort(a[0])[::-1]
dongxiao
2022-03-04 09:49:57 +08:00
```
d[:, d.argsort(axis=1)[0]]
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/837783

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX