我希望能够根据之前处理过的参考数组对numpy 2D数组进行排序。
我的想法是将numpy.argsort
输出存储在参考数组中,并使用它来对其他数组进行排序:
In [13]: # my reference array
...: ref_arr = np.random.randint(10, 30, 12).reshape(3, 4)
Out[14]:
array([[12, 22, 12, 13],
[28, 26, 21, 23],
[24, 14, 16, 25]])
# desired output:
array([[12, 14, 12, 13],
[24, 22, 16, 23],
[28, 26, 21, 25]])
我的尝试:
In [15]: # store the sorting matrix
...: sm = np.argsort(ref_arr, axis=0)
Out[16]:
array([[0, 2, 0, 0],
[2, 0, 2, 1],
[1, 1, 1, 2]])
但是不幸的是,最后一步只适用于一维数组:
In [17]: ref_arr[sm]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-17-48b785178465> in <module>()
----> 1 ref_arr[sm]
IndexError: index 3 is out of bounds for axis 0 with size 3
我发现了这个与此问题有关的Github问题,但不幸的是,它仅解决了我尝试的适用于一维数组的方法。
在该问题的评论中,提到了一个类似于我的问题的例子。这段代码片段没有解决我的问题,因为它是按行排序而不是按列排序。但是它给了我一个方向。
a[np.arange(np.shape(a)[0])[:,np.newaxis], np.argsort(a)]
很遗憾,我并不理解这个例子,无法将其适应到我的使用场景上。或许有人能够解释一下这里的高级索引是如何工作的呢?这可能会使我自己解决问题,但当然,如果有现成的解决方案,我也不介意。
谢谢。
以防万一:我正在使用 Python 3.6.1 和 numpy 1.12.1 在 OS X 上。
argsort
调用没有按照你所说的轴进行排序。 - user2357112argsort
正在沿着行排序,而你说你想要另一个方向。 - user2357112a[np.arange(np.shape...np.argsort(a)]
。 - hpaulj