如何反转并转发Python中的NumPy 2D数组?

问题描述:

我有表格的数据:如何反转并转发Python中的NumPy 2D数组?

#--------------------- 
# Data 
#--------------------- 
p q r 
2 8 14 
2 9 22 
1 5 19 
2 7 19 
3 11 13 
2 7 20 
1 4 15 
3 12 17 
1 4 14 
1 5 20 
2 7 17 
3 10 13 
3 11 20 
3 11 14 
1 6 18 
3 12 16 
2 9 21 
3 10 19 
2 8 13 
1 6 22 
1 4 13 
2 8 15 
3 12 15 
3 10 16 
2 9 16 
1 5 16 
1 6 21 

现在我需要以按如下方式使用NumPy的这样的数据:

  1. 升序列页。
  2. 列q的升序。
  3. 第r列的降序。

我用下面的代码,但它不排序正确:

import numpy as np 

data = open('data.dat', "r") 
line = data.readline() 
while line.startswith('#'): 
    line = data.readline() 
data_header = line.split("\t") 
data_header[-1] = data_header[-1].strip() 

_data_ = np.genfromtxt(data, comments='#', delimiter='\t', names = data_header, dtype = None, unpack = True).transpose()   # Read space-separated values in engine data file. 
sorted_index = np.lexsort((_data_['r'][::-1], _data_['q'], _data_['p'])) 
_data_ = _data_[sorted_index] 
print (_data_) 

Ouptut

1 4 15 
1 4 14 
1 4 13 
1 5 19 
1 5 20 
1 5 16 
1 6 21 
1 6 22 
1 6 18 
2 7 20 
2 7 19 
2 7 17 
2 8 13 
2 8 15 
2 8 14 
2 9 22 
2 9 21 
2 9 16 
3 10 13 
3 10 16 
3 10 19 
3 11 14 
3 11 13 
3 11 20 
3 12 16 
3 12 15 
3 12 17 

什么能在此排序方法可能是错误的?

问题是,当您反转r列时,numpy不知道您的索引更改。 解决方法将分为两步,但它不会很优雅:

pre_sort_index = np.lexsort((_data_['r'],), axis=0)[::-1] 
sorted_index = np.lexsort((_data_[pre_sort_index]['q'], _data_[pre_sort_index]['p'])) 
_data_ = _data_[pre_sort_index][sorted_index]