我如何排序一个NumPy数组的第n列?
例如,给定:
a = array([[9, 2, 3],
[4, 5, 6],
[7, 0, 5]])
我想对a的行按第二列进行排序,得到:
array([[7, 0, 5],
[9, 2, 3],
[4, 5, 6]])
我如何排序一个NumPy数组的第n列?
例如,给定:
a = array([[9, 2, 3],
[4, 5, 6],
[7, 0, 5]])
我想对a的行按第二列进行排序,得到:
array([[7, 0, 5],
[9, 2, 3],
[4, 5, 6]])
当前回答
正如Python文档wiki所建议的:
a = ([[1, 2, 3], [4, 5, 6], [0, 0, 1]]);
a = sorted(a, key=lambda a_entry: a_entry[1])
print a
输出:
[[[0, 0, 1], [1, 2, 3], [4, 5, 6]]]
其他回答
我也遇到过类似的问题。
我的问题:
我想计算SVD,并需要对特征值进行降序排序。但是我想保持特征值和特征向量之间的映射。 我的特征值在第一行对应的特征向量在它下面的同列。
我想对一个二维数组按第一行降序按列排序。
我的解决方案
a = a[::, a[0,].argsort()[::-1]]
那么这是如何工作的呢?
a[0,]是我要排序的第一行。
现在我使用argsort来获取下标的顺序。
我使用[::-1]是因为我需要降序。
最后我使用了一个[::,…]以获得按正确顺序排列的视图。
你可以按照Steve Tjoa的方法对多个列进行排序,使用像归并排序这样的稳定排序,并从最不重要的列到最重要的列对索引进行排序:
a = a[a[:,2].argsort()] # First sort doesn't need to be stable.
a = a[a[:,1].argsort(kind='mergesort')]
a = a[a[:,0].argsort(kind='mergesort')]
这是按第0列,第1列,第2列排序。
一个稍微复杂一点的lexsort示例-在第一列降序,在第二列次级升序。lexsort的技巧是按行排序(因此使用. t),并优先考虑最后一行。
In [120]: b=np.array([[1,2,1],[3,1,2],[1,1,3],[2,3,4],[3,2,5],[2,1,6]])
In [121]: b
Out[121]:
array([[1, 2, 1],
[3, 1, 2],
[1, 1, 3],
[2, 3, 4],
[3, 2, 5],
[2, 1, 6]])
In [122]: b[np.lexsort(([1,-1]*b[:,[1,0]]).T)]
Out[122]:
array([[3, 1, 2],
[3, 2, 5],
[2, 1, 6],
[2, 3, 4],
[1, 1, 3],
[1, 2, 1]])
按a的第二列排序:
a[a[:, 1].argsort()]
def sort_np_array(x, column=None, flip=False):
x = x[np.argsort(x[:, column])]
if flip:
x = np.flip(x, axis=0)
return x
数组在原来的问题:
a = np.array([[9, 2, 3],
[4, 5, 6],
[7, 0, 5]])
问题作者所期望的sort_np_array函数的结果:
sort_np_array(a, column=1, flip=False)
[2]: array([[7, 0, 5],
[9, 2, 3],
[4, 5, 6]])