gpt4 book ai didi

python - 获取排序矩阵索引的简单方法

转载 作者:行者123 更新时间:2023-11-28 22:22:38 25 4
gpt4 key购买 nike

我想对整个矩阵进行排序,并得到一个索引向量。在 R 中,这可以通过命令简单地实现

order("matrix")

在 Python 中,类似的命令是:

np.argsort("matrix", axis=None)

问题是,虽然 R 也能识别矩阵的向量索引(即 matrix[1] 给出一个数字,而不是一行),但在 Python 中我们似乎总是需要两个索引。

所以我必须按照 this 中的步骤操作问题。但我需要更改代码,因为 zip() 似乎只能与 Python 3+ 中的 list() 一起正常工作(或者我错了吗?)。新代码将是

import numpy as np    
a = np.array([[1,4,3],[2,8,0]])
n = a.shape[1]
d = list(zip( np.argsort(a, axis=None).__divmod__(n)))
d = list(zip(d[0][0], d[1][0]))

但是R代码就是这么简单!因此我想知道是否不可能在 Python 中找到类似的简单命令。或者是否有一些类似的方便方法可以将矩阵也视为向量。

最佳答案

你的 d

In [362]: d
Out[362]: [(1, 2), (0, 0), (1, 0), (0, 2), (0, 1), (1, 1)]

argsortNone 为数组的展平版本生成排序索引:

In [366]: np.argsort(a, axis=None)
Out[366]: array([5, 0, 3, 2, 1, 4], dtype=int32)
In [368]: a.flat[_] # apply this index to flattened a
Out[368]: array([0, 1, 2, 3, 4, 8])

np.argsort(a.flat) 做同样的事情。 (或者使用 a.ravel() 如果这对你更有意义。)

我们可以展开一维索引:

In [369]: np.unravel_index(Out[366], a.shape)
Out[369]:
(array([1, 0, 1, 0, 0, 1], dtype=int32),
array([2, 0, 0, 2, 1, 1], dtype=int32))

这使用与您所做的相同类型的 divmod 计算。它可以用来直接索引a:

In [370]: a[_]
Out[370]: array([0, 1, 2, 3, 4, 8])

transpose 可以将该数组元组转换为类似于您的 d 的二维数组:

In [371]: np.transpose(__)
Out[371]:
array([[1, 2],
[0, 0],
[1, 0],
[0, 2],
[0, 1],
[1, 1]], dtype=int32)

(np.argwherenp.where 的结果做同样的事情。)

或者在一行中

In [375]: np.transpose(np.unravel_index(np.argsort(a, axis=None), a.shape)).tolist()
Out[375]: [[1, 2], [0, 0], [1, 0], [0, 2], [0, 1], [1, 1]]

请注意,索引对列表类型不能用于索引aOut[369] 是对二维数组中的项目进行索引的正确形式。我对R不熟悉,但看起来它的索引风格可能更像MATLAB。

关于python - 获取排序矩阵索引的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47609759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com