Sar*_*ara 3 python sorting numpy matrix
我已经尝试使用Ned Batchelder代码按人类顺序排序NumPy矩阵,正如以下帖子中提出的那样:
代码在一维数组上运行,命令为:
print (sorted(a, key=natural_keys))
Run Code Online (Sandbox Code Playgroud)
现在,我的问题是我的数据是一个10列矩阵,我想根据一列对它进行排序(比方说MyColumn).我找不到修改代码的方法来打印根据这个列排序的整个矩阵.我能想到的就是:
print (sorted(a['MyColumn'], key=natural_keys))
Run Code Online (Sandbox Code Playgroud)
但是,当然,只会MyColumn在输出中显示,尽管它已正确排序......
有没有办法打印整个Matrix?
这是我用来加载数组的命令(我将原始的imputfile简化为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
Run Code Online (Sandbox Code Playgroud)
以下是输出理想情况:
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
Run Code Online (Sandbox Code Playgroud)
如果你有一个np.matrix,叫m:
col = 1
m[np.array(m[:,col].argsort(axis=0).tolist()).ravel()]
Run Code Online (Sandbox Code Playgroud)
如果你有一个np.ndarray,叫a:
col = 1
a[a[:,col].argsort(axis=0)]
Run Code Online (Sandbox Code Playgroud)
如果您有一个带有命名列的结构化数组:
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
Run Code Online (Sandbox Code Playgroud)
对于您的特定情况,您需要以下key功能:
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)
Run Code Online (Sandbox Code Playgroud)