版本:numpy 1.22.3 。使用numpy的argsort函数对二维数组按行(列)排序,返回排序索引时出错
>>> array = [[0, 1, 2, 3, 4, 5],
[444, 4, 8, 3, 1, 10],
[2, 5, 8, 999, 1, 4]]
>>> np.argsort(array, axis=0)
array([[0, 0, 0, 0, 1, 2],
[2, 1, 1, 1, 2, 0],
[1, 2, 2, 2, 0, 1]], dtype=int64)
没有报错,但是,第五、六列按列排序的索引有很明显的问题
我的思路,以第六列为例:
我尝试过转置之后一行一行地执行再拼接,但仍然有问题
返回正确的排序索引
有一种pandas的方法可以实现(你问的应该是rank),需要先转换为dataframe,再用rank解决:
arr=np.array(pd.DataFrame(array).rank(axis=0,method='min'))
这是从1-n的排序,如果想从0开始,后面直接减去一即可
目前我还没有搜查到numpy有直接的方法,需要再查一下
稍等 我试一下代码
解决方法
这种其实直接sort就行
array = [[0, 1, 2, 3, 4, 5],
[444, 4, 8, 3, 1, 10],
[2, 5, 8, 999, 1, 4]]
array.sort()
print(array)
输出
[[0, 1, 2, 3, 4, 5], [2, 5, 8, 999, 1, 4], [444, 4, 8, 3, 1, 10]]
稍等 我试一下代码
解决方法
这种其实直接sort就行
array = [[0, 1, 2, 3, 4, 5],
[444, 4, 8, 3, 1, 10],
[2, 5, 8, 999, 1, 4]]
array.sort()
print(array)
输出
[[0, 1, 2, 3, 4, 5], [2, 5, 8, 999, 1, 4], [444, 4, 8, 3, 1, 10]]
另一种
argsort的原因在于用法错误
argsort()只能用来查看排序情况,而不会对数组进行重排
按照官网的说法:
argsort()返回将对数组进行排序的索引。
使用kind关键字指定的算法沿给定轴执行间接排序。它返回一个索引数组,其形状与 沿给定轴的索引数据按排序顺序排列。
Demo
你得到的索引没问题啊,比如你的第5列数是[4,1,1],按从小到大排为1,1,4,通过排序后的位置索引为1,2,0;同样第6列数是[5,10,4],argsort(x,axis=0)按列从小到大排为4,5,10,则索引为2,0,1。
不知道题主说的是那里有错?
.argsort返回排序后的索引号,再用.take_along_axis返回对应数值
>>> arr = np.array([[0, 1, 2, 3, 4, 5],
[444, 4, 8, 3, 1, 10],
[2, 5, 8, 999, 1, 4]])
>>> idx = np.argsort(arr,axis=0)
>>> idx
array([[0, 0, 0, 0, 1, 2],
[2, 1, 1, 1, 2, 0],
[1, 2, 2, 2, 0, 1]], dtype=int64)
>>> arr = np.take_along_axis(arr, idx, axis=0)
>>> arr
array([[ 0, 1, 2, 3, 1, 4],
[ 2, 4, 8, 3, 1, 5],
[444, 5, 8, 999, 4, 10]])
axis=0表示是按列进行排序,对每列进行排序并给出索引值。索引值也对应每列。比如:第一列的值为:0,444,2(索引值分别为0、1、2)。其从小到大的索引值:0,2,1。与你得出的索引值数组第一列相同。其他的列也是同样的,你这个没问题。