我如何排序一个NumPy数组的第n列?

例如,给定:

a = array([[9, 2, 3],
           [4, 5, 6],
           [7, 0, 5]])

我想对a的行按第二列进行排序,得到:

array([[7, 0, 5],
       [9, 2, 3],
       [4, 5, 6]])

当前回答

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]])

其他回答

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]])

我也遇到过类似的问题。

我的问题:

我想计算SVD,并需要对特征值进行降序排序。但是我想保持特征值和特征向量之间的映射。 我的特征值在第一行对应的特征向量在它下面的同列。

我想对一个二维数组按第一行降序按列排序。

我的解决方案

a = a[::, a[0,].argsort()[::-1]]

那么这是如何工作的呢?

a[0,]是我要排序的第一行。

现在我使用argsort来获取下标的顺序。

我使用[::-1]是因为我需要降序。

最后我使用了一个[::,…]以获得按正确顺序排列的视图。

熊猫的方法只是为了完整性:

a = np.array([[9, 2, 3],
              [4, 5, 6],
              [7, 0, 5]])              
a = pd.DataFrame(a) 

             
a.sort_values(1, ascending=True).to_numpy()
array([[7, 0, 5], # '1' means sort by second column
       [9, 2, 3],
       [4, 5, 6]])

prl900 基准测试,与公认的答案相比:

%timeit pandas_df.sort_values(9, ascending=True)
1000 loops, best of 3: 400 µs per loop

%timeit numpy_table[numpy_table[:,9].argsort()]
10000 loops, best of 3: 180 µs per loop  

按a的第二列排序:

a[a[:, 1].argsort()]

感谢这篇文章:https://stackoverflow.com/a/5204280/13890678

我用结构化数组找到了一个更“通用”的答案。 我认为这种方法的一个优点是代码更容易阅读。

import numpy as np
a = np.array([[9, 2, 3],
           [4, 5, 6],
           [7, 0, 5]])

struct_a = np.core.records.fromarrays(
    a.transpose(), names="col1, col2, col3", formats="i8, i8, i8"
)
struct_a.sort(order="col2")

print(struct_a)
[(7, 0, 5) (9, 2, 3) (4, 5, 6)]