Numpy 二维数组,按某行或者某列排序

##Numpy 二维数组,按某行或者某列排序
需求:对二维数组进行按某行或者某列排序

1.numpy.lexsort()不修改原数组,返回索引,小数序列在前,如果要倒叙前面加-负号
2.先对指定行列排序;若有相等值,再根据相等值所在行(或列)排序;
3.若还有想等值,一直往前递推,如果有多行列,顺序为从后往前
4.k[:,:]序列切片,获取全部序列,k[起:末:间隔(行),起:末:间隔(列)]不包含末数据
5.k.T 矩阵转置,行列互换

1.按最后一列排序

Original=np.array([[1,2,6,4],
                   [7,5,3,4],
                   [7,8,8,9]])
print("原型:\n"+str(Original))
#按最后一列排序(x,y)(1,4)(2,4)(3,4)
sort=Original.T
print("1.按最后一个列排序(x,y)(1,4)(2,4)(3,4):\n转型后:\n"+str(sort))
sorted_index=np.lexsort(sort)
print("排序后输出序列:\n"+str(sorted_index))
print("先对[4,4,9]排序得到[0,0,1],出现同等级的,再往前推对[6,3,8]排序得到[1,0,2]\n")
print("排序后输出数组\n"+str(Original[sorted_index]))


输出:
原型:
[[1 2 6 4]
 [7 5 3 4]
 [7 8 8 9]]

1.按最后一个列排序(x,y)(1,4)(2,4)(3,4):
转型后:
[[1 7 7]
 [2 5 8]
 [6 3 8]
 [4 4 9]]

排序后输出序列:
[1 0 2]

先对[4,4,9]排序得到[0,0,1],出现同等级的,再往前推对[6,3,8]排序得到[1,0,2]

排序后输出数组
[[7 5 3 4]
 [1 2 6 4]
 [7 8 8 9]]

2.按最后一个列排序(x,y)(1,4)(2,4)(3,4),倒序

sort=Original.T
print("2.按最后一个列排序(x,y)(1,4)(2,4)(3,4)倒序:\n转型后:\n"+str(sort))
sorted_index=np.lexsort(-sort)
print("排序后输出序列:\n"+str(sorted_index))
print("np.lexsort(-sort)在输入矩阵前加入符号为倒序\n")
print("排序后输出数组\n"+str(Original[sorted_index]))


输出:
原型:
[[1 2 6 4]
 [7 5 3 4]
 [7 8 8 9]]

2.按最后一个列排序(x,y)(1,4)(2,4)(3,4)倒序:
转型后:
[[1 7 7]
 [2 5 8]
 [6 3 8]
 [4 4 9]]

排序后输出序列:
[2 0 1]

np.lexsort(-sort)在输入矩阵前加入符号为倒序

排序后输出数组
[[7 8 8 9]
 [1 2 6 4]
 [7 5 3 4]]

3.按第三列排序(某列)

sort=Original[:,:3].T
print("3.按第三列排序(x,y)(1,3)(2,3)(3,3):\n"+str(sort))
sorted_index=np.lexsort(sort)
print("排序后输出序列:\n"+str(sorted_index))
print("对[6,3,8]排序得到[1,0,2],Original[:,:3]=[[1,2,6],[7,5,3],[7,8,8]]"+"再对其进行转置\n")
print("排序后输出数组\n"+str(Original[sorted_index]))


输出:
原型:
[[1 2 6 4]
 [7 5 3 4]
 [7 8 8 9]]

3.按第三列排序(x,y)(1,3)(2,3)(3,3):
[[1 7 7]
 [2 5 8]
 [6 3 8]]

排序后输出序列:
[1 0 2][6,3,8]排序得到[1,0,2],Original[:,:3]=[[1,2,6],[7,5,3],[7,8,8]]再对其进行转置

排序后输出数组
[[7 5 3 4]
 [1 2 6 4]
 [7 8 8 9]]

4.按最后一行排序

#按最后一行排序(x,y)(3,1)(3,2)(3,3)(3,4)
sort=Original
print("4.按最后一行排序(x,y)(3,1)(3,2)(3,3)(3,4):\n转型后:\n"+str(sort))
sorted_index=np.lexsort(sort)
print("排序后输出序列:\n"+str(sorted_index))
print("先对[7,8,8,9]排序得到[0,1,1,2],出现同等级的,再往前推对[7,5,3,4]排序得到[0,2,1,3]\n")
print("排序后输出数组\n"+str(Original.T[sorted_index].T))

原型:
[[1 2 6 4]
 [7 5 3 4]
 [7 8 8 9]]

4.按最后一行排序(x,y)(3,1)(3,2)(3,3)(3,4):
转型后:
[[1 2 6 4]
 [7 5 3 4]
 [7 8 8 9]]

排序后输出序列:
[0 2 1 3]

先对[7,8,8,9]排序得到[0,1,1,2],出现同等级的,再往前推对[7,5,3,4]排序得到[0,2,1,3]

排序后输出数组
[[1 6 2 4]
 [7 3 5 4]
 [7 8 8 9]]

5.按第一行排序(某行)

#按第一行排序(x,y)(1,1)(1,2)(1,3)(1,4)
sort=Original[:1,:]
print("5.按第一行排序(x,y)(1,1)(1,2)(1,3)(1,4):\n转型后:\n"+str(sort))
sorted_index=np.lexsort(sort)
print("排序后输出序列:\n"+str(sorted_index))
print("先对[7,8,8,9]排序得到[0,1,1,2],出现同等级的,再往前推对[7,5,3,4]排序得到[0,2,1,3]\n")
print("排序后输出数组\n"+str(Original.T[sorted_index].T))

输出:
原型:
[[1 2 6 4]
 [7 5 3 4]
 [7 8 8 9]]

5.按第一行排序(x,y)(1,1)(1,2)(1,3)(1,4):
转型后:
[[1 2 6 4]]

排序后输出序列:
[0 1 3 2]

先对[7,8,8,9]排序得到[0,1,1,2],出现同等级的,再往前推对[7,5,3,4]排序得到[0,2,1,3]

排序后输出数组
[[1 2 4 6]
 [7 5 4 3]
 [7 8 9 8]]

你可能感兴趣的:(python)