python - 对给定列的 numpy 矩阵进行排序

标签 python numpy sorting matrix

我已尝试使用 Ned Batchelder 代码以人工顺序对 NumPy 矩阵进行排序,正如以下帖子中所提议的那样:

Sort numpy string array with negative numbers?

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

print (sorted(a, key=natural_keys))

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

print (sorted(a['MyColumn'], key=natural_keys))

但是,当然,只有 MyColumn 出现在输出中,尽管它已正确排序...

有没有办法打印整个矩阵?

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

data = np.loadtxt(inputfile, dtype={'names': ('ID', 'MyColumn', 'length'),
'formats': ('int32', 'S40', 'int32')},skiprows=1, delimiter='\t')

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

这是理想情况下的输出:

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

最佳答案

如果你有一个名为 mnp.matrix:

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

如果你有一个np.ndarray,叫做a:

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

对于您的具体情况,您需要 the following key function :

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)

关于python - 对给定列的 numpy 矩阵进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17387219/

相关文章:

python - "We' 是不可变的,所以使用 __new__ 而不是 __init__"

Numpy/Scipy - 稀疏矩阵到向量

python-3.x - 向 ndarray 添加维度并 reshape

ios - 排序数组导致错误的数据显示到单元格中

python - 如何理解日志格式器?

python - BeautifulSoup:从 html 获取 css 类

c# - LINQ 中字母数字数据的 SQL Order By 子句未按预期排序

Python 列表排序

python - 使用 python 对列表进行排序时出现问题

python - PyCharm 社区 3.1.1 和 Numpy, "' 矩阵'不可调用”,但代码有效