2

我知道numpy.argsort(),但它所做的是返回数组中元素的索引,该数组将沿某个轴排序。

我需要的是对N 维数组中的所有值进行排序,并得到一个线性元组列表作为结果。

像这样:

>>> import numpy
>>> A = numpy.array([[7, 8], [9, 5]])
>>> numpy.magic(A)
[(1, 0), (0, 1), (0, 0), (1, 1)]

PS 我什至不明白 argsort 的输出试图告诉我这个数组是什么。

4

1 回答 1

3

np.argsort(A)分别对每一行进行排序A。例如,

In [21]: np.argsort([[6,5,4],[3,2,1]])
Out[21]: 
array([[2, 1, 0],
       [2, 1, 0]])

相反,您希望将数组展平为一维值数组,然后对其进行 argsort 。这可以通过将axis参数设置为None(感谢@Akavall 指出这一点)来完成:

In [23]: np.argsort(A, axis=None)
Out[23]: array([3, 0, 1, 2])

然后使用np.unravel_index恢复A.


In [14]: import numpy as np

In [15]: A = np.array([[7, 8], [9, 5]])   

In [4]: np.column_stack(np.unravel_index(np.argsort(A, axis=None)[::-1], A.shape))
Out[4]: 
array([[1, 0],
       [0, 1],
       [0, 0],
       [1, 1]])

请注意,对于 NumPy 版本 1.5.1 或更早版本,np.unravel_index如果为其第一个参数传递了一个类似数组的对象,则会引发 ValueError。在这种情况下,您可以使用列表推导:

In [17]: [np.unravel_index(p, A.shape) for p in np.argsort(A, axis=None)[::-1]]
Out[17]: [(1, 0), (0, 1), (0, 0), (1, 1)]
于 2013-04-21T12:48:03.417 回答