Python 按行按最小值对矩阵排序

Python 按行按最小值对矩阵排序,python,numpy,matrix,Python,Numpy,Matrix,我有一些矩阵和运算,最后得到一个矩阵MatrizFinal,它有一个数字,然后是一个id,顺序从0到n。我想对矩阵进行排序,使行按数字的最小值排序,而不是按ID排序,因为稍后我将取最小值,所以我需要ID import numpy as np v1=np.matrix('1,2;3,4;2,6;4,5') v2=np.matrix('5,6;7,8;1,2;3,4') print('first matrix') print(v1) print('second matrix:') print(v

我有一些矩阵和运算,最后得到一个矩阵MatrizFinal,它有一个数字,然后是一个id,顺序从0到n。我想对矩阵进行排序,使行按数字的最小值排序,而不是按ID排序,因为稍后我将取最小值,所以我需要ID

 import numpy as np

v1=np.matrix('1,2;3,4;2,6;4,5')
v2=np.matrix('5,6;7,8;1,2;3,4')
print('first matrix')
print(v1)
print('second matrix:')
print(v2)

k=0

distancias = []
posiciones=[]

#do the euclidean distance and also add the position from 0 to n, depending on the rows it has.
for i in v1:

    distancias.append(np.linalg.norm(v2-v1[k,:]))
    posiciones.append(k)
    print(distancias[k])
    k=k+1

print(distancias)
print (posiciones)
#create a matrix that has both columns
matrizFinal=np.column_stack((distancias, posiciones))
print (matrizFinal)
最终输出矩阵为:

 [[ 10.58300524   0.        ]
 [  6.92820323   1.        ]
 [  7.74596669   2.        ]
 [  6.32455532   3.        ]]
但是我想把行从最小值排序到最大值。在本例中,我想要的结果是:

 [[ 6.32455532   3.        ]
 [  6.92820323   1.        ]
 [  7.74596669   2.        ]
 [  10.58300524   0.       ]]

但是numpy排序算法不起作用。我该怎么做呢?

我刚刚测试过,它在Python 3.6.1中运行良好

M = np.matrix(sorted(matrizFinal, key=lambda x: x[0]))
我很确定有更好更快的方法,但这是我第一次想到的

苏尔特


编辑:对不起,我不明白你的问题,但4x4矩阵帮助了我。现在我认为它达到了您的预期。

我在使用numpy sort时遇到了与您在问题中提到的相同的问题,即每一列都不会相对于其他列进行排序。为了克服这个问题,我们可以找到要排序的列的索引,然后应用于所有列

numpy解决方案:

>>> matrizFinal[np.argsort(matrizFinal, axis=0)[:,0]]
>>> array([[  6.32455532 ,   3.  ],
   [  6.92820323 ,   1.  ],
   [  7.74596669 ,   2.  ],
   [ 10.58300524 ,   0.  ]])

其中[:,0]从列0中提取索引。

按行翻转:matrizFinal[::-1]?如果numpy不适合您,请使用基本Python。转换为列表列表,对列表进行排序,然后转换回数组。这仅适用于本例。我需要按最小值排序,以防我有10行,不同的值不是按最大值或最小值排序。所以这是行不通的@DivakarBut如果我对列表进行排序,那么我将丢失附加到数字值的id,这是我不想要的。我想让这些值按最小值排序,然后知道它有哪个id。我也不知道numpy是否做不到。我尝试了几种排序numpy算法,但它们不起作用。跳过翻转,因此:matrizFinal[matrizFinal[:,0]。argsort]。我想说:我尝试过,它按ID排序,而不是按值排序!但多亏了你的编辑,现在一切都很好!非常感谢!格雷西亚斯!