【问题标题】:Sort a numpy matrix based on its diagonal根据对角线对 numpy 矩阵进行排序
【发布时间】:2012-08-17 10:26:58
【问题描述】:

我有一个矩阵,它应该在对角线上有一个,但列被混淆了。

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

有什么建议吗?

【问题讨论】:

  • 因为它们是浮点数,你能保证它们是 1.0 并且在它们的列中是唯一的吗?
  • @wim:存在浮点错误的问题。但是,保证对角线上的每个条目在该行中具有最高值。

标签: python matrix numpy scipy


【解决方案1】:
>>> 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 所在列的索引进行排序。

【讨论】:

  • 标准库再次获胜。有什么方法可以做到这一点而不必使用 numpy 列表?我可以想象这对于大型数组来说相当慢。
  • @jozzas:它实际上根本不依赖 numpy。取出np.array 部分就可以了。
  • 对不起,我的意思是 python 列表。有没有 numpy-only 解决方案?
  • @jozzas:我没有看到明显的 numpy-only 解决方案。也许其他人可以想出一个。
  • 我想我有一个,但不知道它比这个好得多。
【解决方案2】:

您可以使用 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.  ]])

【讨论】:

  • 非常好。对于 1000x1000 阵列,你的运行时间为 0.1 秒,我的运行时间为 10 秒。
猜你喜欢
  • 2016-07-22
  • 2021-06-29
  • 2016-04-18
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多