根据对角线对numpy矩阵进行排序

时间:2012-08-22 02:33:53

标签: python matrix numpy scipy

我有一个矩阵,应该在对角线上有一个但是列混合在一起。

Messed up matrix

但是我不知道如果没有明显的for循环,有效地交换行以在对角线上获得统一。我甚至不确定我会通过什么钥匙来排序。

有什么建议吗?

2 个答案:

答案 0 :(得分:7)

您可以使用numpy的argmax来确定目标列排序,并使用argmax结果作为列索引重新排序矩阵:

>>> z = numpy.array([[ 0.1 ,  0.1 ,  1.  ],
...                  [ 1.  ,  0.1 ,  0.09],
...                  [ 0.1 ,  1.  ,  0.2 ]])

numpy.argmax(z, axis=1)

>>> array([2, 0, 1]) #Goal column indices

z[:,numpy.argmax(z, axis=1)]

>>> array([[ 1.  ,  0.1 ,  0.1 ],
...        [ 0.09,  1.  ,  0.1 ],
...        [ 0.2 ,  0.1 ,  1.  ]])

答案 1 :(得分:3)

>>> import numpy as np
>>> a = np.array([[ 1. ,  0.5,  0.5,  0. ],
...               [ 0.5,  0.5,  1. ,  0. ],
...               [ 0. ,  1. ,  0. ,  0.5],
...               [ 0. ,  0.5,  0.5,  1. ]])
>>> np.array(sorted(a, cmp=lambda x, y: list(x).index(1) - list(y).index(1)))
array([[ 1. ,  0.5,  0.5,  0. ],
       [ 0. ,  1. ,  0. ,  0.5],
       [ 0.5,  0.5,  1. ,  0. ],
       [ 0. ,  0.5,  0.5,  1. ]])

它实际上按行排序,而不是列(但结果是相同的)。它的工作原理是按1所在列的索引进行排序。