Python 为给定列排序numpy矩阵

Python 为给定列排序numpy矩阵,python,numpy,sorting,matrix,Python,Numpy,Sorting,Matrix,我曾尝试使用Ned Batcheld代码按人类顺序对NumPy矩阵进行排序,正如本文中所建议的那样: 代码在一维数组上运行,命令为: print (sorted(a, key=natural_keys)) 现在,我的问题是,我的数据是一个10列矩阵,我想根据一列对其进行排序(比如说MyColumn)。我找不到一种方法来修改代码以打印根据这一列排序的整个矩阵。我能想到的就是: print (sorted(a['MyColumn'], key=natural_keys)) 但是,当然,只有My

我曾尝试使用Ned Batcheld代码按人类顺序对
NumPy
矩阵进行排序,正如本文中所建议的那样:

代码在一维数组上运行,命令为:

print (sorted(a, key=natural_keys))
现在,我的问题是,我的数据是一个10列矩阵,我想根据一列对其进行排序(比如说
MyColumn
)。我找不到一种方法来修改代码以打印根据这一列排序的整个矩阵。我能想到的就是:

print (sorted(a['MyColumn'], key=natural_keys))
但是,当然,只有
MyColumn
显示在输出中,尽管它已正确排序

是否有办法打印整个矩阵?

以下是用于加载数组的命令(我将原始输入文件简化为3列数组):

以下是理想情况下的输出:

ID  MyColumn    length
72406   BFT_job1_q0_type3   696
197388  BFT_job8_q0_type2   244
164967  BFT_job13_q0_type1  944
164967  BFT_job13_q1_type2  426

如果您有一个名为
m
np.matrix

col = 1
m[np.array(m[:,col].argsort(axis=0).tolist()).ravel()]

如果您有一个名为
a
np.ndarray

col = 1
a[a[:,col].argsort(axis=0)]
如果您有一个具有命名列的结构化数组:

def mysort(data, col_name, key=None):
    d = data.copy()
    cols = [i[0] for i in eval(str(d.dtype))]
    if key:
        argsort = np.array([key(i) for i in d[col_name]]).argsort()
    else:
        argsort = d[col_name].argsort()
    for col in cols:
        d[col] = d[col][argsort]
    return d
针对您的具体情况,您需要:


谢谢仍然无法正确排序。。。1-表示“索引器:索引太多”指向[:,col]2-我将[:,col]更改为[:][col],它似乎可以完成这项工作,但我不知道在何处插入key=natural\u键以正确排序。我可能会添加。。。我不知道如何检查我是否有np.ndarray或np.matrix!我用np.loadtxt加载了一个文本文件当用
np.loadtxt()加载时,你有一个
np.ndarray
,它应该可以工作,你不需要
自然键
。。。您只需通知要使用
col
对哪一列进行排序,记住
0
是大作业编号的第一列,只需在格式化字符串中使用更高数量的数字,如
{1:{f}{a}10}{2:{f}{a}10}{3:{f}{a}10}{/code>。。。可处理高达
99999999
def mysort(data, col_name, key=None):
    d = data.copy()
    cols = [i[0] for i in eval(str(d.dtype))]
    if key:
        argsort = np.array([key(i) for i in d[col_name]]).argsort()
    else:
        argsort = d[col_name].argsort()
    for col in cols:
        d[col] = d[col][argsort]
    return d
def key(x):
    x = ''.join([i for i in x if i.isdigit() or i=='_'])
    return '{1:{f}{a}10}_{2:{f}{a}10}_{3:{f}{a}10}'.format(*x.split('_'), f='0', a='>')

d = mysort(data, 'MyColumn', key)