python - 从最大到最小对二维矩阵元素进行排序,也跟踪 ij 索引
问题描述
给定一个上三角矩阵(或下三角)
A = np.array([[1, 2, 3],
[0, 4, 5],
[0, 0, 6]]
)
我想将它的值从最大到最小排序,跟踪 ij 索引,所以例如在这个矩阵中我想要类似的东西
6, (2,2)
5, (1,2)
4, (1,1)
3, (0,2)
2, (0,1)
1, (0,0)
这个简单的例子使用了一个整数矩阵,但它应该处理浮点数以及任意大的矩阵,通常在 10x10 到 40x40 之间。速度不是很重要,它是一次性操作。此外,它不需要上下,矩阵是对称的,所以如果更容易,我可以简单地填充相反的三角形。
我试过np.argsort()
了,但这只是给了
array([[0, 1, 2],
[0, 1, 2],
[0, 1, 2]], dtype=int64)
也就是说,它独立地对每一行进行排序。这没有多大帮助,因为我不想要每行中最大元素的列表,可能是一行具有所有最大值。
解决方案
您可以使用此答案中显示的代码(假设您否定您的数组)来执行“2d argsort”。
>>> A = np.array([[1, 2, 3], [0, 4, 5], [0, 0, 6]])
>>> A
array([[1, 2, 3],
[0, 4, 5],
[0, 0, 6]])
>>> np.dstack(np.unravel_index(np.argsort(-A.ravel()), (3, 3)))
array([[[2, 2],
[1, 2],
[1, 1],
[0, 2],
[0, 1],
[0, 0],
[1, 0],
[2, 0],
[2, 1]]], dtype=int64)
PS:如果任何对自己的 numpy 技能有信心的用户觉得这应该是骗子,请标记它,同时这将是Stef 在评论中建议的“社区 Wiki” 。
推荐阅读
- c++ - 如何通过几个成员函数使用 C++ lamda
- python - 从同名的内部函数访问全局函数
- javascript - 如何将这两者合并为 Javascript 的一个功能?
- java - 如何修复在 docker 中运行的 Azure Cosmos Emulator (Linux) 中的零星读取超时和服务不可用错误?
- android - 如果我知道对象的起始位置,是否可以在没有对象检测器的情况下使用 mediapipe 进行对象跟踪?
- reactjs - 如何在 React 中将路由添加到我的登录页面
- azure-sql-database - Azure SQL 网络防火墙和专用终结点
- r - 如何将数据框中的值与列表中的值匹配,然后将列表附加到 R 中?
- magento - 通过数据库从 Magento 2 导出产品和属性
- bash - 如何将 xargs -P 输出重定向到单独命名的文件